javascript:在dom中查找字符串并强调它

ajs*_*sie 6 javascript dom

我想要一个函数,找到我在DOM中的数组中的一些字符串并强调它.

例如.

keywords[0] = 'linux';
keywords[1] = 'suse pro';
Run Code Online (Sandbox Code Playgroud)
<body>
    im a huge fan of <em>linux</em> and at the moment im using <em>suse pro</em> and finds it amazing.
</body>
Run Code Online (Sandbox Code Playgroud)

我怎么用最简单的方式做到这一点.提前致谢

编辑:我找到了一个非常简单的方法来完成这个:jquery突出显示插件!干杯!

sle*_*man 7

几个月前我不得不这样做.最初有人使用了其他人建议的innerHTML的字符串操作,但这条路导致了疯狂.麻烦的角落案例是:如果标记的关键字是元素的类名或id,该怎么办?我们也不想破坏任何嵌入式JavaScript并且意外地导致无效标记.还需要处理嵌入式CSS样式.最后,您最终为HTML4.0 + ECMAscript + css编写了一个文本解析器,即使在有限的情况下,它也是很多工作 - 它正在编写您自己的Web浏览器 - IN JAVASCRIPT!

但是我们已经在Web浏览器中有一个HTML + JS + CSS解析器,它为我们生成了一个很好的DOM树.所以我决定用它.这就是我最终提出的:

keywords = ['hello world','goodbye cruel world'];
function replaceKeywords (domNode) {
    if (domNode.nodeType === Node.ELEMENT_NODE) { // We only want to scan html elements
        var children = domNode.childNodes;
        for (var i=0;i<children.length;i++) {
            var child = children[i];

            // Filter out unwanted nodes to speed up processing.
            // For example, you can ignore 'SCRIPT' nodes etc.
            if (child.nodeName != 'EM') {
                replaceKeywords(child); // Recurse!
            }
        }
    }
    else if (domNode.nodeType === Node.TEXT_NODE) { // Process text nodes
        var text = domNode.nodeValue;

        // This is another place where it might be prudent to add filters

        for (var i=0;i<keywords.length;i++) {
            var match = text.indexOf(keywords[i]); // you may use search instead
            if (match != -1) {
                // create the EM node:
                var em = document.createElement('EM');

                // split text into 3 parts: before, mid and after
                var mid = domNode.splitText(match);
                mid.splitText(keywords[i].length);

                // then assign mid part to EM
                mid.parentNode.insertBefore(em,mid);
                mid.parentNode.removeChild(mid);
                em.appendChild(mid);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

只要您小心过滤掉您不想处理的事物(例如,空文本节点只包含空格 - 有很多它们,相信我),这非常快.

额外的过滤未实现算法清晰度 - 留给读者练习.