2017-09-03 1 views
0

Donc je crée une extension de chrome où je remplace le mot école par la prison (Le code est écrit pour les norvégiens donc il dit skole pas école et fengsel au lieu de prison)Vérification et remplacement de plusieurs chaînes à l'intérieur d'un texte/noeud Chrome Exstension

Ceci est mon code actuel 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); 
       } 
    } 
} 
} 

et ceci est mon manifeste:

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

donc, avec ce code, je suis en mesure de changer la phrase: Skole soutien-gorge pour skolen. Pour: Fengsel er bra pour skolen. Mon problème est que parce que je l'utilise bien si je n'Excecute la prochaine instruction if si la précédente a été étét exécutée, mais si j'enlever l'autre si et seulement si je reçois cette erreur

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 

Ma question est de savoir comment pour résoudre ce problème et que le code remplace tous les mots trouvés dans le nœud.

+1

Il n'y a pas besoin de remplacer le nœud, attribuez simplement 'node.nodeValue' à la nouvelle valeur. – wOxxOm

+0

On dirait que votre méthode fonctionne, mais maintenant elle ne change que pour fensel, pas fengselene ou fengselet. J'essaie de comprendre pourquoi mais je ne trouve pas de raison. Ma nouvelle méthode est en train de faire node.nodeValue = replaceText (1 puis 2 et ainsi de suite). @wOxxOm –

Répondre

1

Cela ne fonctionne pas car dans replaceChild le deuxième paramètre spécifie l'élément qui doit être remplacé. Dans la première si-phrase, vous supprimez node du DOM, donc lorsque vous essayez de le remplacer la deuxième fois, il échoue.

Comme wOxxOm suggère, vous pouvez le remplacer directement:

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

Ou, si vous insistez sur le remplacement du nœud, vous pouvez le faire comme ceci:

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

édité votre code un peu en faisant node.nodeValue = node.nodeValue.replace() pour tous les remplacements pas tous en un si vous comprenez ce que j'essaie d'expliquer. –