javascript - prototype.js 突出显示单词。 DOM 正确高效遍历

标签 javascript html prototypejs highlight

我想在页面加载后突出显示我的 HTML 页面中的特定单词。我不想使用哑巴:

document.innerHTML = document.innerHTML.replace(.....);

我想遍历每个 DOM 节点,找出包含文本的节点并仅修改那些单个节点的 innerHTML。这是我想出的:

function highlightSearchTerms(sword) {
$$('body').map(Element.extend).first().descendants().each(function (el) {
    if (el.nodeType == Node.ELEMENT_NODE && el.tagName != 'TD') {
        //$A(el.childNodes).each(function (onlyChild) {
            //if (onlyChild.nodeType == Node.TEXT_NODE) {
                //console.log(onlyChild);
                el.innerHTML = el.innerHTML.replace(new RegExp('('+sword+')', 'gi'), '<span class="highlight">$1</span>');
            //}
        //});
    }
});
//document.body.innerHTML.replace(new RegExp('('+sword+')', 'gi'), '<span class="highlight">$1</span>');
}

它现在可以正常工作,但效率非常低,并且几乎不比上面的单行好,因为它可能会在同一文本上进行多次替换。 (嗯...,还是不是?)

如果您取消注释注释的内容并将 el.innerHTML.replace 更改为 onlyChild.textContent.replace 它几乎可以正常工作,但修改 textContent 不会不要创建一个新的跨度作为元素,而是将 HTML 内容添加为文本。

我的问题/要求是找到一种方法,它可以逐个遍历元素来突出显示文档中的单词。

最佳答案

这工作起来又快又干净:

function highlightSearchTerms(sword) {
$$('body').map(Element.extend).first().descendants().each(function (el) {
    if (el.nodeType == Node.ELEMENT_NODE && el.tagName != 'TEXTAREA' && el.tagName != 'INPUT' && el.tagName != 'SCRIPT') {
        $A(el.childNodes).each(function (onlyChild) {
            var pos = onlyChild.textContent.indexOf(sword);
            if (onlyChild.nodeType == Node.TEXT_NODE && pos >= 0) {
                //console.log(onlyChild);
                var spannode = document.createElement('span');
                spannode.className = 'highlight';
                var middlebit = onlyChild.splitText(pos);
                var endbit = middlebit.splitText(sword.length);
                var middleclone = middlebit.cloneNode(true);
                spannode.appendChild(middleclone);
                middlebit.parentNode.replaceChild(spannode, middlebit);

                //onlyChild. = el.innerHTML.replace(new RegExp('('+sword+')', 'gi'), '<span class="highlight">$1</span>');
            }
        });
    }
});
}

但我很难理解它究竟是如何工作的。这似乎是魔法线:

middlebit.parentNode.replaceChild(spannode, middlebit);

关于javascript - prototype.js 突出显示单词。 DOM 正确高效遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1650389/

相关文章:

javascript - Angularjs 定期调用函数?

javascript - 如何在 Chart.js 的水平条中对齐计数文本中心?

javascript - JavaScript 的 Object.prototype 行为是什么?

javascript - 如何从服务器数据创建 "add to calendar"iCal 链接(.ics 文件)并将其发送回我的 webApp?

javascript - 使用 cookie 确定网页是否仍处于打开状态

php - 这个ajax(带原型(prototype))有什么问题?

javascript - 使用jquery将字符串数组转换为整数

javascript - 为什么当我在浏览器中运行时我的输入没有更新? - Javascript

PrototypeJS 中的 jQuery fadeIn 函数

javascript - javascript中的原型(prototype)继承概念作为基于原型(prototype)的语言