Signatur
Beschreibung
TreeWalker.whatToShow liefert die Bitmaske, die beim Erzeugen des Walkers mit document.createTreeWalker(root, whatToShow, filter) als zweites Argument übergeben wurde. Jedes gesetzte Bit steht für einen Knotentyp, etwa NodeFilter.SHOW_ELEMENT (0x1), NodeFilter.SHOW_TEXT (0x4) oder NodeFilter.SHOW_COMMENT (0x80). Mehrere Typen kombiniert man mit dem bitweisen ODER-Operator |.
Die Eigenschaft ist vor allem dann nützlich, wenn ein Walker an eine andere Funktion weitergegeben wird und diese prüfen soll, welche Knotentypen er liefert. Die Prüfung geht mit dem bitweisen UND-Operator: (walker.whatToShow & NodeFilter.SHOW_TEXT) !== 0.
Wichtig für das Verständnis: whatToShow wird vor einem eventuell angegebenen filter ausgewertet. Knoten, deren Typ nicht in der Maske steht, werden wie mit NodeFilter.FILTER_SKIP behandelt. Der Knoten selbst wird also übersprungen, seine Nachkommen werden aber weiter durchlaufen. Der eigene Filter wird nur für Knoten aufgerufen, die diese Vorauswahl bestanden haben.
Mögliche Konstanten (alle auf NodeFilter):
SHOW_ALL(0xFFFFFFFF)SHOW_ELEMENT(0x1)SHOW_ATTRIBUTE(0x2)SHOW_TEXT(0x4)SHOW_CDATA_SECTION(0x8)SHOW_PROCESSING_INSTRUCTION(0x40)SHOW_COMMENT(0x80)SHOW_DOCUMENT(0x100)SHOW_DOCUMENT_TYPE(0x200)SHOW_DOCUMENT_FRAGMENT(0x400)- veraltet:
SHOW_ENTITY_REFERENCE(0x10),SHOW_ENTITY(0x20),SHOW_NOTATION(0x800)
Rückgabewert
unsigned long), die aus NodeFilter.SHOW_*-Konstanten zusammengesetzt ist. Bei SHOW_ALL ist der Wert 4294967295, nicht -1.Beispiele
Maske eines Walkers auslesen
// Walker, der nur Elemente und Kommentare liefert
const walker = document.createTreeWalker(
document.body,
NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT
);
console.log(walker.whatToShow); // 1 | 128
console.log(walker.whatToShow.toString(16)); // hexadezimal
Prüfen, ob ein bestimmter Knotentyp enthalten ist
const zeigtTyp = (walker, flag) => (walker.whatToShow & flag) !== 0;
const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT);
console.log(zeigtTyp(walker, NodeFilter.SHOW_TEXT)); // true
console.log(zeigtTyp(walker, NodeFilter.SHOW_ELEMENT)); // false
Hilfsfunktion: Maske in lesbare Namen umwandeln
const flagNamen = Object.keys(NodeFilter)
.filter((k) => k.startsWith('SHOW_') && k !== 'SHOW_ALL');
const beschreibeMaske = (maske) =>
maske === NodeFilter.SHOW_ALL
? ['SHOW_ALL']
: flagNamen.filter((k) => (maske & NodeFilter[k]) !== 0);
const walker = document.createTreeWalker(
document,
NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT
);
console.log(beschreibeMaske(walker.whatToShow));
console.log(beschreibeMaske(
document.createTreeWalker(document).whatToShow
));
Alle Textknoten eines Absatzes sammeln
const p = document.createElement('p');
p.innerHTML = 'Hallo <strong>schöne</strong> <!-- Notiz --> Welt';
const walker = document.createTreeWalker(p, NodeFilter.SHOW_TEXT);
console.log('Maske:', walker.whatToShow);
const texte = [];
while (walker.nextNode()) {
texte.push(walker.currentNode.nodeValue);
}
console.log(texte);
// Wichtig · Fallstricke
- Schreibgeschützt: Die Maske lässt sich nach dem Erzeugen nicht mehr ändern. Eine Zuweisung wird im nicht-strikten Modus stillschweigend ignoriert und löst im Strict Mode (also auch in ES-Modulen) einen
TypeErroraus. Für eine andere Maske erzeugt man einen neuen Walker. - Vorzeichen:
SHOW_ALLergibt4294967295. Bitweise Operatoren in JavaScript liefern dagegen vorzeichenbehaftete 32-Bit-Werte, so istNodeFilter.SHOW_ALL | 0gleich-1. Direkte Vergleiche wiemaske === (a | b)können deshalb scheitern. Besser ist der Vergleich mit>>> 0oder die Prüfung einzelner Bits mit&. - Standardwert: Fehlt das zweite Argument bei
createTreeWalker(), giltSHOW_ALL. - Wurzelknoten:
currentNodesteht anfangs aufroot, auch wenn dessen Typ nicht in der Maske enthalten ist. - Übersprungen, nicht verworfen: Knoten außerhalb der Maske werden übersprungen, ihre Kinder aber trotzdem besucht. Das entspricht
FILTER_SKIP, nichtFILTER_REJECT. - SHOW_ATTRIBUTE ist in der Praxis wirkungslos, weil Attribute (
Attr) keine Kindknoten im DOM-Baum sind.SHOW_ENTITY_REFERENCE,SHOW_ENTITYundSHOW_NOTATIONsind veraltet. - Kompatibilität: wird von allen modernen Browsern unterstützt. Der Wert verhält sich genauso wie
NodeIterator.whatToShow.