检查并替换文本/节点Chrome扩展中的多个字符串

时间:2017-09-03 07:52:26

标签: javascript google-chrome google-chrome-extension

所以我正在创建一个chrome扩展,我用监狱取代了学校这个词(代码是为挪威人编写的,所以它说skole不是学校而是fengsel而不是监狱)

这是我目前的javascript代码:

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 replacedText = text.replace(/skolenes/gi, 'fengselenes');
        var replacedText1 = text.replace(/skolene/gi, 'fengselene');
        var replacedText2 = text.replace(/skolen/gi, 'fengselet');
        var replacedText3 = text.replace(/skoler/gi, 'fengsler');
        var replacedText4 = text.replace(/skole/gi, 'fengsel');

        if(replacedText !== text){
            element.replaceChild(document.createTextNode(replacedText), node);
        }else if(replacedText1 !== text){
            element.replaceChild(document.createTextNode(replacedText1), node);
        }else if(replacedText2 !== text){
            element.replaceChild(document.createTextNode(replacedText2), node);
        }else if(replacedText3 !== text){
            element.replaceChild(document.createTextNode(replacedText3), node);
        }else if(replacedText4 !== text){
                  element.replaceChild(document.createTextNode(replacedText4), node);
              }
    }
}
}

这是我的清单:

{
"manifest_version" : 2,
"name": "Skole er fengsel",
"description": "Endre ordet skole til fengsel",
"version": "0.0.1",
"content_scripts": [
    {
        "matches": [
            "http://*/*",
            "https://*/*"
            ],
            "js": [
                "content.js"
                ],
                "run_at": "document_end"
    }
]
}

所以使用这个代码,我可以改变句子:Skole er bra for skolen。 To:Fengsel er bra for skolen。我的问题是因为我使用了其他如果我不执行下一个if语句如果之前的那个被删除了,但是如果我带走了其他如果只有我得到这个错误

content.js:26 Uncaught DOMException: Failed to execute 'replaceChild' on 'Node': The node to be replaced is not a child of this node.
at chrome-extension://jofeghinfepefmgbllmcicjpjdbeenkg/content.js:26:31
(anonymous) @ content.js:26

我的问题是如何解决这个问题并使代码替换节点内所有找到的单词。

1 个答案:

答案 0 :(得分:1)

它不起作用,因为在replaceChild中第二个参数指定了需要替换的元素。在第一个if语句中,您从DOM中删除node,因此当您第二次尝试更换它时,它会失败。

与wOxxOm建议的一样,您可以直接替换它:

if (node.nodeType === 3) {
  node.nodeValue =
    node.nodeValue
      .replace(/skolenes/gi, 'fengselenes')
      .replace(/skolene/gi, 'fengselene')
      .replace(/skolen/gi, 'fengselet')
      .replace(/skoler/gi, 'fengsler')
      .replace(/skole/gi, 'fengsel');
}

或者,如果你坚持要更换节点,你可以这样做:

if (node.nodeType === 3) {
  var text = node.nodeValue;
  var replacedText = 
    text.replace(/skolenes/gi, 'fengselenes')
        .replace(/skolene/gi, 'fengselene')
        .replace(/skolen/gi, 'fengselet')
        .replace(/skoler/gi, 'fengsler')
        .replace(/skole/gi, 'fengsel');

  if (replacedText !== text) {
    element.replaceChild(document.createTextNode(replacedText), node);
  }
}