2013-04-22 3 views
9

Ich habe ein Dokument mit einem Debug-Kommentar in ihm, das wie folgt aussieht:Gibt es eine DOM-API zum Abfragen von Kommentarknoten?

<!--SERVER_TRACE {...}--> 

Gibt es eine Möglichkeit, den DOM abzufragen diesen Knoten zugreifen? Ich suche nach einer JavaScript-Lösung von Vanille, ohne die Hilfe von Bibliotheken.

Mein erster Gedanke war, Tiefe zunächst das DOM zu suchen und Knoten mit dem Knoten Typ Wert für Kommentare, Node.COMMENT_NODE vergleichen. Gibt es einen leichteren Weg?

+1

möglich Duplikat von [Auswählen von HTML-Kommentaren mit jQuery] (http://stackoverflow.com/questions/1623734/selecting-html-comments-with-jquery) –

+0

Wow, ich war ** sicher ** Ich wusste diesen Kommentar Knoten wurden entfernt. Aber nicht soweit ich das beurteilen kann: http://jsbin.com/ivufav/1/edit Habe es in Firefox, Chrome und sogar IE7 versucht. Sie alle hatten einen Knoten mit 'nodeType == 8' im Ziel und löschten somit keine Kommentare. –

+7

@ SébastienRenault: Kein Duplikat, da diese Frage das 'jquery' -Tag angibt, dieses nicht. Es fragt explizit nach einer DOM-API, nicht nach einer Bibliothek. (Und das OP weiter geklärt im Kommentar zu einer Antwort, dass er nicht jQuery verwenden möchte.) –

Antwort

8

Es gibt die TreeWalker APIs:

var tw = document.createTreeWalker(document, NodeFilter.SHOW_COMMENT, null, null), 
    comment; 
while (comment = tw.nextNode()) { 
    // ... 
} 

Das ist nicht von IE8 und niedriger unterstützt wird.

T.J. in den Kommentaren zur Verfügung gestellt link to the specs. Ich benutze immer nur TreeWalkers, aber in Ihrem Fall ist eine NodeIterator auch in Ordnung.

+1

+1 Wow, und sie sind nicht einmal neu: http://www.w3.org/TR/DOM-Level-2-Traversal-Range/traversal.html Wie ist die Unterstützung (außer

+0

@ T.J.Crowder Uh, noch nie umfangreiche Tests gemacht, aber Chrome, Firefox und Opera unterstützen es alle. Ich denke, Sie können es auch in mobilen Browsern finden. Wie auch immer, ich habe sogar ein Polyfill für die Browser programmiert, die es nicht unterstützen. – MaxArt

+4

Hier ist meine vorherige JSFiddle aktualisiert, um die 'document.createTreeWalker()' zu verwenden: http://jsfiddle.net/JCDnh/3/ viel kleiner und einfacher zu lesen, technisch die gleichen Schritte, aber möglicherweise schneller, wenn die JavaScript-Engine ist nativen Code nutzen –

6

Die Core-Eigenschaft nodeType ermöglicht die Unterscheidung zwischen Knotenarten. In diesem speziellen Fall repräsentiert 8 Kommentare. Da sie keinen Selektor haben, müssen Sie ihre Eltern durchlaufen, um sie zu bekommen (was saugt, weiß ich). Der folgende Code filtert sie heraus für Sie:

$("*").contents().filter(function(){ 
    return this.nodeType == Node.COMMENT_NODE; 
}) 

Und meine eigene jQuery-Version weniger, weil einige Leute es nicht haben:

function getAllComments() { 
    var t = [], 
     recurse = function (elem) { 
      if (elem.nodeType == Node.COMMENT_NODE) { 
       t.push(elem); 
      }; 
      if (elem.childNodes && elem.childNodes.length) { 
       for (var i = 0; i < elem.childNodes.length; i++) { 
        recurse(elem.childNodes[i]); 
       }; 
      }; 
     }; 
    recurse(document.getElementsByTagName("html")[0]); 
    return t; 
}; 

Wenn Sie auf einem bestimmten suchen möchten Verknüpfen Sie den Knoten document.getElementsByTagName mit einer Variablen Ihrer Wahl.

Bearbeiten: fiddle, um die Verwendung zu demonstrieren, von Jason Sperske getan!

+0

Und wo sagt das OP, dass er jQuery verwendet? –

+2

Vorheriger Kommentar ist korrekt, ich möchte keine jQuery-Lösung. Bearbeiten: Dies bedeutet, dass diese Frage nicht ein Duplikat von "HTML-Kommentare mit jQuery auswählen" ist. –

+0

@ T.J.Crowder: wo sagt das OP * nicht *? Nichtsdestotrotz habe ich eine reine JS-Implementierung hinzugefügt. –

Verwandte Themen