Så här filtrerar du och spårar DOM-träd med JavaScript
Visste du att det finns ett JavaScript API vars enda uppdrag är att filtrera ut och iterera genom noderna vi vill ha från ett DOM-träd? I själva verket inte en, men det finns två sådana API: NodeIterator
och TreeWalker
. De är ganska lika varandra, med några användbara skillnader. Båda kan returnera en lista med noder som är närvarande under en given rotknutpunkt under överensstämmelse med alla fördefinierade och / eller anpassade filterregler tillämpas på dem.
De fördefinierade filtren som finns tillgängliga i API: erna kan hjälpa oss rikta olika typer av noder till exempel textnoder eller elementnoder och anpassade filter (tillagt av oss) kan filtrera bunten ytterligare, till exempel genom att leta efter noder med specifikt innehåll. Den returnerade listan med noder är iterable, dvs de kan vara looped genom, och vi kan arbeta med alla enskilda noder i listan.
Hur man använder NodeIterator
API
en NodeIterator
objekt kan skapas med hjälp av createNodeIterator ()
metod för dokumentera
gränssnitt. Den här metoden tar tre argument. Den första är nödvändig; Det”s root node som rymmer alla noder vi vill filtrera ut.
Det andra och det tredje argumentet är valfri. De är fördefinierade och anpassade filter, respektive. De fördefinierade filtren är tillgängliga för användning som konstanter av NodeFilter
objekt.
Till exempel, om NodeFilter.SHOW_TEXT
konstant läggs till som den andra parametern kommer det att returnera en iterator för a lista över alla textnoder under root-noden. NodeFilter.SHOW_ELEMENT
kommer att återvända endast element noden. Se en fullständig lista över alla tillgängliga konstanter.
Det tredje argumentet (det anpassade filtret) är a funktion som implementerar filtret.
Här är en exempel kodbit:
Dokumentera titel
detta är sidomappenText lite länkHej
Hur mår du?
Förutsatt att vi vill extrahera innehållet i alla textnoder som finns inuti #omslag
div, Så här använder vi oss av det NodeIterator
:
var div = document.querySelector ('# wrapper'); var nodeIterator = document.createNodeIterator (div, NodeFilter.SHOW_TEXT); medan (nodeIterator.nextNode ()) console.log (nodeIterator.referenceNode.nodeValue.trim ()); / * konsolutgång [Logga] det här är sidomappen [Logga] Hej [Logga in] [Logga] Hur är du? [Logg] * /
De nextNode ()
metod för NodeIterator
API returnerar nästa nod i listan över iterbara textnoder. När vi använder det i en medan
loop för att komma åt varje nod i listan loggar vi in det trimmade innehållet i varje textnod i konsolen. De referenceNode
egendom av NodeIterator
returnerar noden som iseratorn för närvarande är ansluten till.
Som du kan se i utmatningen finns det några textnoder med bara tomma mellanslag för innehållet. Vi kan Undvik att visa dessa tomma innehåll med hjälp av ett anpassat filter:
var div = document.querySelector ('# wrapper'); var nodeIterator = document.createNodeIterator (div, NodeFilter.SHOW_TEXT, funktion (nod) return (node.nodeValue.trim ()! == "")? NodeFilter.FILTER_ACCEPT: NodeFilter.FILTER_REJECT;); medan (nodeIterator.nextNode ()) console.log (nodeIterator.referenceNode.nodeValue.trim ()); / * konsolutgång [Logga] detta är sidomappen [Logga] Hej [Logga] Hur är det? * /
Den anpassade filterfunktionen returnerar konstanten NodeFilter.FILTER_ACCEPT
om textnoden inte är tom, vilket leder till införandet av den noden i listan över noder, kommer iteratorn att iterera över. I motsats till det NodeFilter.FILTER_REJECT
konstant återlämnas för att utesluta de tomma textnoderna från den iterbara listan över noder.
Hur man använder TreeWalker
API
Som jag nämnde tidigare, den NodeIterator
och TreeWalker
API: er är liknar varandra.
TreeWalker
kan skapas med hjälp av createTreeWalker ()
metod för dokumentera
gränssnitt. Denna metod, precis som createNodeFilter ()
, tar tre argument: rotenoden, ett fördefinierat filter och ett anpassat filter.
Om vi Använd TreeWalker
API istället för NodeIterator
det föregående kodstycket ser ut som följande:
var div = document.querySelector ('# wrapper'); var treeWalker = document.createTreeWalker (div, NodeFilter.SHOW_TEXT, funktion (nod) return (node.nodeValue.trim ()! == "")? NodeFilter.FILTER_ACCEPT: NodeFilter.FILTER_REJECT;); medan (treeWalker.nextNode ()) console.log (treeWalker.currentNode.nodeValue.trim ()); / * output [Logga] det här är sidomappen [Logga in] Hej [Logga] Hur är du? * /
Istället för referenceNode
, de currentNode
egenskapen hos TreeWalker
API används till få tillgång till noden som iteratorn för närvarande är ansluten till. Utöver nextNode ()
metod, Treewalker
har andra användbara metoder. De previousNode ()
metod (finns även i NodeIterator
) returnerar föregående nod av noden är iteratorn för närvarande förankrad till.
Liknande funktionalitet utförs av parent ()
, förstfödde()
, sista barnet()
, previousSibling ()
, och nextSibling ()
metoder. Dessa metoder är endast tillgänglig i TreeWalker
API.
Här är ett kodexempel som matar ut det sista barnet i noden iteratorn är förankrad till:
var div = document.querySelector ('# wrapper'); var treeWalker = document.createTreeWalker (div, NodeFilter.SHOW_ELEMENT); console.log (treeWalker.lastChild ()); / * utgång [logga]Hur mår du?
* /
Vilket API ska du välja?
Välj den NodeIterator
API, när du behöver bara en enkel iterator att filtrera och loop genom de valda knutpunkterna. Och plocka TreeWalker
API, när du behöver komma åt familjen filtrerade noder, som deras närmaste syskon.