So filtern und durchsuchen Sie den DOM-Baum mit JavaScript
Wussten Sie, dass es eine JavaScript-API gibt, deren einzige Aufgabe es ist filtern und iterieren Sie durch die Knoten wollen wir von einem DOM-Baum? In der Tat gibt es nicht eine, sondern zwei solche APIs: NodeIterator
und Baumwanderer
. Sie sind sich ziemlich ähnlich, mit einigen nützlichen Unterschieden. Beide können Gibt eine Liste von Knoten zurück die unter einem gegebenen Wurzelknoten vorhanden sind, während alle vordefinierten und / oder benutzerdefinierten Filterregeln auf sie angewendet.
Die vordefinierten Filter, die in den APIs verfügbar sind, können uns dabei helfen ziele auf verschiedene Arten von Knoten B. Textknoten oder Elementknoten, und benutzerdefinierte Filter (von uns hinzugefügt) können filtern Sie das Bündel weiter, Zum Beispiel durch Suchen nach Knoten mit bestimmten Inhalten. Die zurückgegebene Liste der Knoten lautet iterable, das können sie sein durchgeschleift, und wir können mit allen einzelnen Knoten in der Liste arbeiten.
Wie benutze ich die NodeIterator
API
EIN NodeIterator
Objekt kann mit dem erstellt werden createNodeIterator ()
Methode der dokumentieren
Schnittstelle. Diese Methode braucht drei Argumente. Der erste ist erforderlich; es”s die Wurzelknoten das enthält alle Knoten, die wir herausfiltern möchten.
Das zweite und das dritte Argument sind wahlweise. Sie sind die vordefinierte und benutzerdefinierte Filter, beziehungsweise. Die vordefinierten Filter stehen als zur Verfügung Konstanten der NodeFilter
Objekt.
Zum Beispiel, wenn die NodeFilter.SHOW_TEXT
Konstante wird als zweiter Parameter hinzugefügt, und es wird ein Iterator für a zurückgegeben Liste aller Textknoten unter dem Wurzelknoten. NodeFilter.SHOW_ELEMENT
wird zurückkehren nur die Elementknoten. Sehen Sie eine vollständige Liste von alle verfügbaren Konstanten.
Das dritte Argument (der benutzerdefinierte Filter) ist a Funktion, die den Filter implementiert.
Hier ist ein Beispiel-Code-Snippet:
Dokumentieren Titel
Dies ist der SeitenumbruchTXT irgendein LinkHallo
Wie geht es Ihnen?
Angenommen, wir wollen Extrahieren Sie den Inhalt aller Textknoten, die sich in der #Verpackung
div, So gehen wir damit um NodeIterator
:
var div = document.querySelector ('# wrapper'); var nodeIterator = document.createNodeIterator (div, NodeFilter.SHOW_TEXT); while (nodeIterator.nextNode ()) console.log (nodeIterator.referenceNode.nodeValue.trim ()); / * console output [Log] Dies ist der Seitenwrapper [Log] Hallo [Log] [Log] Wie geht es Ihnen? [Log] * /
Das nextNode ()
Methode der NodeIterator
API gibt den nächsten Knoten in der Liste der iterierbaren Textknoten zurück. Wenn wir es in einem verwenden während
Um auf jeden Knoten in der Liste zuzugreifen, protokollieren wir den zugeschnittenen Inhalt jedes Textknotens in der Konsole. Das referenceNode
Eigentum von NodeIterator
gibt den Knoten zurück, an den der Iterator aktuell angeschlossen ist.
Wie Sie in der Ausgabe sehen können, gibt es einige Textknoten, deren Inhalt nur Leerzeichen enthält. Wir können Vermeiden Sie es, diese leeren Inhalte mithilfe eines benutzerdefinierten Filters anzuzeigen:
var div = document.querySelector ('# wrapper'); var nodeIterator = document.createNodeIterator (div, NodeFilter.SHOW_TEXT, Funktion (Knoten) return (node.nodeValue.trim ()! == "")? NodeFilter.FILTER_ACCEPT: NodeFilter.FILTER_REJECT;); while (nodeIterator.nextNode ()) console.log (nodeIterator.referenceNode.nodeValue.trim ()); / * console output [Log] Dies ist der Seitenwrapper [Log] Hallo [Log] Wie geht es Ihnen? * /
Die benutzerdefinierte Filterfunktion gibt die Konstante zurück NodeFilter.FILTER_ACCEPT
wenn der Textknoten nicht leer ist, Dies führt zur Aufnahme dieses Knotens in die Liste der Knoten, über die der Iterator iteriert. Im Gegensatz dazu die NodeFilter.FILTER_REJECT
Konstante wird zurückgegeben, um schließen Sie die leeren Textknoten aus aus der iterierbaren Liste der Knoten.
Wie benutze ich die Baumwanderer
API
Wie ich schon sagte, die NodeIterator
und Baumwanderer
APIs sind sich ähneln.
Baumwanderer
kann mit dem erstellt werden createTreeWalker ()
Methode der dokumentieren
Schnittstelle. Diese Methode, genau wie createNodeFilter ()
, braucht drei Argumente: den Wurzelknoten, einen vordefinierten Filter und einen benutzerdefinierten Filter.
Wenn wir benutze die Baumwanderer
API statt NodeIterator
Das vorherige Code-Snippet sieht wie folgt aus:
var div = document.querySelector ('# wrapper'); var treeWalker = document.createTreeWalker (div, NodeFilter.SHOW_TEXT, Funktion (Knoten) return (node.nodeValue.trim ()! == "")? NodeFilter.FILTER_ACCEPT: NodeFilter.FILTER_REJECT;); while (treeWalker.nextNode ()) console.log (treeWalker.currentNode.nodeValue.trim ()); / * output [Log] Dies ist der Seitenwrapper [Log] Hallo [Log] Wie geht es Ihnen? * /
Anstatt referenceNode
, das currentNode
Eigentum der Baumwanderer
API ist es gewohnt Zugriff auf den Knoten, an den der Iterator derzeit angeschlossen ist. In Ergänzung zu nextNode ()
Methode, Treewalker
hat andere nützliche Methoden. Das previousNode ()
Methode (auch vorhanden in NodeIterator
) gibt den vorherigen Knoten zurück des Knotens, an dem der Iterator derzeit verankert ist.
Eine ähnliche Funktionalität übernimmt der Elternknoten()
, erstes Kind()
, letztes Kind()
, previousSibling ()
, und nextSibling ()
Methoden. Diese Methoden sind nur in der Baumwanderer
API.
Hier ist ein Codebeispiel dafür gibt das letzte Kind des Knotens aus Der Iterator ist verankert an:
var div = document.querySelector ('# wrapper'); var treeWalker = document.createTreeWalker (div, NodeFilter.SHOW_ELEMENT); console.log (treeWalker.lastChild ()); / * ausgeben [Protokoll]Wie geht es Ihnen?
* /
Welche API soll gewählt werden?
Wählen Sie das NodeIterator
API, wenn Sie Ich brauche nur einen einfachen Iterator die ausgewählten Knoten filtern und durchlaufen. Und wähle das aus Baumwanderer
API, wenn Sie müssen auf die Familie der gefilterten Knoten zugreifen, wie ihre unmittelbaren Geschwister.