Signatur
Beschreibung
Die Methode previousSibling() eines TreeWalker sucht ausgehend von currentNode den nächsten Geschwisterknoten davor, den whatToShow und der optionale filter durchlassen. Wird ein solcher Knoten gefunden, wird currentNode auf ihn gesetzt und er wird zurückgegeben. Andernfalls ist der Rückgabewert null, und currentNode bleibt unverändert.
Anders als die Eigenschaft Node.previousSibling arbeitet die Methode auf dem gefilterten, logischen Baum des TreeWalkers. Mit NodeFilter.SHOW_ELEMENT werden zum Beispiel Textknoten mit Leerraum und Kommentare automatisch übersprungen. Deshalb eignet sich die Methode gut, um Elemente rückwärts auf derselben Ebene zu durchlaufen, etwa für Tastaturnavigation in Listen, Menüs oder Tabellenzeilen.
Wichtig ist, wie der Filter wirkt:
- Liefert der Filter für einen Geschwisterknoten
NodeFilter.FILTER_SKIP, wird nur dieser Knoten übersprungen. Die Suche geht dann in seine Kinder (beginnend beim letzten Kind), denn logisch rücken diese auf seine Ebene nach. - Bei
NodeFilter.FILTER_REJECTwird der ganze Teilbaum übersprungen. - Die Suche geht nie über den
rootdes TreeWalkers hinaus.
Rückgabewert
currentNode ist. Gibt es keinen passenden Knoten, ist der Rückgabewert null, und currentNode ändert sich nicht.Beispiele
Listeneinträge rückwärts durchlaufen
const list = document.createElement('ul');
list.innerHTML = '<li>Eins</li><li>Zwei</li><li>Drei</li>';
const walker = document.createTreeWalker(list, NodeFilter.SHOW_ELEMENT);
// Beim letzten Eintrag anfangen
walker.currentNode = list.lastElementChild;
let node;
while ((node = walker.previousSibling())) {
console.log(node.textContent);
}
Kein Vorgänger: null, currentNode bleibt gleich
const list = document.createElement('ul');
list.innerHTML = '<li>Eins</li><li>Zwei</li>';
const walker = document.createTreeWalker(list, NodeFilter.SHOW_ELEMENT);
walker.currentNode = list.firstElementChild;
console.log(walker.previousSibling());
console.log(walker.currentNode.textContent);
Unterschied zu Node.previousSibling (Leerraum-Textknoten)
const box = document.createElement('div');
box.innerHTML = '<p>A</p>\n <!-- Hinweis -->\n <p>B</p>';
const b = box.lastElementChild;
// Die DOM-Eigenschaft liefert den Leerraum-Textknoten
console.log(b.previousSibling.nodeName);
// Der TreeWalker mit SHOW_ELEMENT überspringt Text und Kommentar
const walker = document.createTreeWalker(box, NodeFilter.SHOW_ELEMENT);
walker.currentNode = b;
console.log(walker.previousSibling().textContent);
FILTER_SKIP: Suche geht in übersprungene Knoten hinein
const root = document.createElement('div');
root.innerHTML = '<section><h2>Kapitel 1</h2></section><h2>Kapitel 2</h2>';
// Nur Überschriften annehmen, alle anderen Elemente überspringen (nicht verwerfen)
const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {
acceptNode: (n) => n.tagName === 'H2'
? NodeFilter.FILTER_ACCEPT
: NodeFilter.FILTER_SKIP
});
walker.currentNode = root.lastElementChild; // <h2>Kapitel 2</h2>
// <section> wird übersprungen, ihr letztes Kind ist logisch der Vorgänger
console.log(walker.previousSibling().textContent);
// Wichtig · Fallstricke
- Nur dieselbe Ebene:
previousSibling()geht nicht zum Elternknoten hinauf und nicht in Kinder akzeptierter Knoten hinein. Für eine Rückwärtssuche in Dokumentreihenfolge über alle Ebenen gibt esTreeWalker.previousNode(). - Gefilterter Baum: Mit
FILTER_SKIPkönnen Knoten „Geschwister“ sein, die im echten DOM auf verschiedenen Ebenen liegen. MitFILTER_REJECTwird dagegen der ganze Teilbaum ausgeblendet. Diese Wahl beeinflusst das Ergebnis stark. - Bei
nullnicht weiterrechnen: DacurrentNodegleich bleibt, entstehen in Schleifen keine Fehlzustände. Den Rückgabewert trotzdem immer aufnullprüfen, bevor man auf Eigenschaften zugreift. - Grenze
root: IstcurrentNodederrootselbst, gibt die Methode immernullzurück. - Filter-Funktion: Der Filter wird bei jedem Schritt aufgerufen. Aufwendige Filter kosten in großen Bäumen Leistung. Wirft der Filter eine Ausnahme, wird sie an den Aufrufer weitergegeben.
- Kompatibilität: Wird von allen modernen Browsern und seit Langem auch vom Internet Explorer 9+ unterstützt. In Node.js gibt es die Methode nur über DOM-Umgebungen wie jsdom.