【发布时间】:2017-04-04 06:58:41
【问题描述】:
我正在开发一个 Google Chrome 扩展程序,它允许您自动将突出显示的 CSS 规则应用于您选择的单词。
我有以下代码
var elements = document.getElementsByTagName('*');
for (var i=0; i<elements.length; i++) {
var element = elements[i];
for (var j=0; j<element.childNodes.length; j++) {
var node = element.childNodes[j];
if(node.nodeType === 3) {
var text = node.nodeValue;
var fetchedText = text.match(/teste/gi);
if(fetchedText) {
var replacedText = element.innerHTML.replace(/(teste)/gi, "<span style=\"background-color: yellow\">$1</span>");
if (replacedText !== text) {
element.innerHTML = replacedText;
}
}
}
}
}
这会破坏并冻结我的 Chrome 标签页。但是,如果我从element.innerHTML = replacedText; 切换到element.innerHTML = "text";,这将有效。
我似乎找不到以下代码有什么问题。
【问题讨论】:
-
您记录了
replacedText的价值吗? -
@ScottMarcus 当我登录
replacedText时,它显示了正确的值,例如<span style=\"background-color: yellow\">teste</span>。但是,如果我在element.innerHTML上使用它,它会使我的标签崩溃。 -
您确定在控制台中显示了
\"转义序列吗?您是否尝试将字符串修改为:"<span style='background-color: yellow'>$1</span>"? -
@ScottMarcus 以下是记录内容的示例:
<span style="background-color: yellow">Teste</span> de velocidade <strong>MEO</strong>。我已经从"更改为'并且它仍然使标签崩溃。 -
似乎当您用字符串替换内容时,该字符串包含需要替换的文本。而且,由于该文本是当前节点的子节点,因此您的循环尚未处理它。因此,您的循环随后会找到需要处理的新元素,这实际上是在创建一个无限循环。
标签: javascript google-chrome-extension textnode