简体   繁体   English

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

[英]Checking and replacing multiple strings inside a text/node Chrome Extension

So I am creating a chrome extension where I replace the word school with prison (The code is written for norwegians so it says skole not school and fengsel instead of prison) 因此,我正在创建一个Chrome扩展名,在其中我将“学校”一词替换为“监狱”(该代码是为挪威人编写的,因此它说“不作为学校而不是学校而不是监狱而不是监狱”)

This is my current javascript code: 这是我当前的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);
              }
    }
}
}

and this is my manifest: 这是我的清单:

{
"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"
    }
]
}

So with this code i am able to change the sentence: Skole er bra for skolen. 因此,使用此代码,我可以更改句子:skolen的Skole er bra。 To: Fengsel er bra for skolen. 致:Fengsel sbra for skolen。 My problem is that because i use else if i dont excecute the next if statement if the one before was excecuted, but if i take away the else if and only have if i get this error 我的问题是,因为如果前一个被执行,如果我不执行下一个if语句,我将使用else;但是如果我仅在遇到此错误时才删除else,则我将使用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

My question is how to resolve this problem and make the code replace all the found words inside the node. 我的问题是如何解决此问题并使代码替换节点内所有找到的单词。

It doesn't work because in replaceChild the second parameter specifies which element that needs to be replaced. 它不起作用,因为在replaceChild ,第二个参数指定需要替换的元素。 In the first if-sentence, you remove node from the DOM, so when you try to replace it the second time it fails. 在第一个if语句中,您从DOM中删除了node ,因此当您第二次尝试替换它时,它就会失败。

Like wOxxOm suggests, you can replace it directly: 就像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');
}

Or, if you insist on replacing the node, you could do it like this: 或者,如果您坚持更换节点,则可以这样做:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM