Start · Sprachen · JavaScript · Referenz · TreeWalker.whatToShow

TreeWalker.whatToShow

Eigenschaft

Schreibgeschützte Bitmaske vom Typ <code>unsigned long</code>, die angibt, welche Knotentypen ein <code>TreeWalker</code> berücksichtigt.

seit JavaScript DOM Level 2 Traversal – Baseline: alle Browser Kategorie: webapi

Signatur

TreeWalker.whatToShow

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

Typ
number
Beschreibung
Eine vorzeichenlose 32-Bit-Ganzzahl (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
129 81

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
true 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
));
["SHOW_ELEMENT", "SHOW_TEXT"] ["SHOW_ALL"]

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);
Maske: 4 ["Hallo ", "schöne", " ", " Welt"]

// 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 TypeError aus. Für eine andere Maske erzeugt man einen neuen Walker.
  • Vorzeichen: SHOW_ALL ergibt 4294967295. Bitweise Operatoren in JavaScript liefern dagegen vorzeichenbehaftete 32-Bit-Werte, so ist NodeFilter.SHOW_ALL | 0 gleich -1. Direkte Vergleiche wie maske === (a | b) können deshalb scheitern. Besser ist der Vergleich mit >>> 0 oder die Prüfung einzelner Bits mit &.
  • Standardwert: Fehlt das zweite Argument bei createTreeWalker(), gilt SHOW_ALL.
  • Wurzelknoten: currentNode steht anfangs auf root, 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, nicht FILTER_REJECT.
  • SHOW_ATTRIBUTE ist in der Praxis wirkungslos, weil Attribute (Attr) keine Kindknoten im DOM-Baum sind. SHOW_ENTITY_REFERENCE, SHOW_ENTITY und SHOW_NOTATION sind veraltet.
  • Kompatibilität: wird von allen modernen Browsern unterstützt. Der Wert verhält sich genauso wie NodeIterator.whatToShow.