2016-10-28 1 views
0

Ich benutze das folgende Skript, um den gesamten Text auf einer Seite in einen langen Text ohne Leerzeichen zu ändern "aquickbrownfoxjumpedoveralazfrog", dies ist zu testen, ob Text an allen Orten würde.Ändern Sie alle textNodes auf einer Seite

Aber wenn ich das Skript ausführen, indem Sie es in der Konsole einfügen, fügt es irgendwie diesen Text an verschiedenen Orten zufällig hinzu und füllt die Seite seltsam! Irgendeine Idee, wo ich falsch mache?

(function(el, string){ 
    var n, a=[], walk=document.createTreeWalker(el,NodeFilter.SHOW_TEXT,null,false); 
    while(n=walk.nextNode()) n.nodeValue = string; 
}(document.body, 'abigfoxjumpedoveralazyfrogmultipletimes')); 
+1

Grunddebugging: ' while (n = walk.nextNode()) console.log (n.nodeValue) ' –

Antwort

3

Denken Sie daran, dass ein Textknoten nur ein Leerraum sein kann, oder anders ausgedrückt, ein Leerraum ist auch ein Textknoten. Solche Knoten werden von Ihrem Skript ausgefüllt. Dies führt dazu, dass Ihr Ersatztext an vielen unerwarteten Stellen erscheint.

<div>**THERE IS AN EMPTY TEXT NODE HERE** 
    <span>Hi bob</span>**THERE IS AN EMPTY TEXT NODE HERE** 
</div> 

Ihr Ergebnis wird somit

sein
<div>abigfoxjumpedoveralazyfrogmultipletimes 
    <span>abigfoxjumpedoveralazyfrogmultipletimes</span>abigfoxjumpedoveralazyfrogmultipletimes 
</div> 

für das Vorhandensein einer nicht-white-space Zeichen im Textknoten diesem Test zu vermeiden:

while (n=walk.nextNode()) if (/\S/.test(n.nodeValue)) n.nodeValue = string; 
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
+0

Vielen Dank, das Problem gelöst. Vergessen Sie die Tatsache, dass Leerräume eigene Textknoten sind. – sabithpocker

1

Erwarten Sie SHOW_TEXT, um Ihnen nur sichtbaren Text zu geben? Meine Intuition hier ist, dass es eine Trennung gibt zwischen, wie Sie erwarten, SHOW_TEXT zu wählen und wie es tut.

Leider fehlen den MDN-Dokumenten dazu konkrete Beispiele.

Hier ist ein Stapelüberlauf Antwort, die vielleicht erklären, was passiert: What Is A Text Node, Its Uses? //document.createTextNode()

Es scheint, dass Elemente mehrere Kinder haben können, die Textknoten sind. Ich bin mir nicht sicher, wie der zu analysierende HTML-Code aussieht, aber Sie haben möglicherweise mehrere Textknoten, die alle auf denselben String festgelegt sind.

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzubeziehen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/14129142) –

+0

Ich glaube, der Absatz nach dem Link enthält die wesentlichen Teile der Antwort? –

+0

@ D.Ulick Sie möchten wahrscheinlich ein Codebeispiel geben, wenn Sie "nur Verknüpfung löschen" vermeiden möchten – Tibrogargan

Verwandte Themen