Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查和替换文本/节点扩展中的多个字符串_Javascript_Google Chrome_Google Chrome Extension - Fatal编程技术网

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

Javascript 检查和替换文本/节点扩展中的多个字符串,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,因此,我创建了一个chrome扩展,将单词school替换为监狱(代码是为挪威人编写的,所以它说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.childN

因此,我创建了一个chrome扩展,将单词school替换为监狱(代码是为挪威人编写的,所以它说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);
              }
    }
}
}
因此,有了这段代码,我可以改变句子:Skole er bra代表skolen。致:为skolen设计的Fengsel er文胸。我的问题是,如果我没有执行下一个if语句,那么我就使用else,如果之前的if语句被执行,但是如果我删除了else if,并且只有当我得到这个错误时才使用else

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

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

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

正如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);
  }
}

无需替换节点,只需将其
节点。nodeValue
分配给新值。看起来您的方法可行,但现在它只更改为fensel,而不是fengselene或fengselet。我试图理解为什么,但我找不到任何理由。我的新方法只是执行node.nodeValue=replacedText(1然后2,依此类推)@如果您理解我试图解释的内容,WOXXOme通过对所有替换执行node.nodeValue=node.nodeValue.replace(),稍微修改了您的代码。
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);
  }
}