Signatur
Beschreibung
NodeList.keys() gibt ein Iterator-Objekt zurück, das die Schlüssel der Liste liefert. Bei einer NodeList sind das die numerischen Indizes der enthaltenen Knoten, aufsteigend von 0 bis length - 1. Der Iterator folgt dem Iterationsprotokoll und lässt sich daher mit for...of, dem Spread-Operator oder Array.from() verwenden.
Die Methode ist praktisch, wenn du nur die Positionen der Knoten brauchst, zum Beispiel um Indizes in data--Attribute zu schreiben oder um gezielt über item(i) bzw. list[i] zuzugreifen. Brauchst du Index und Knoten gleichzeitig, ist entries() meist die bessere Wahl. Brauchst du nur die Knoten, nimm values() oder iteriere direkt über die NodeList.
Wichtig: Ob sich die Liste nachträglich ändert, hängt vom Typ der NodeList ab. querySelectorAll() liefert eine statische Liste, Node.childNodes dagegen eine live-Liste, die DOM-Änderungen während der Iteration widerspiegelt.
Rückgabewert
0, 1, 2, …) der Knoten in der NodeList liefert.Beispiele
Indizes mit for...of durchlaufen
const list = document.createElement('ul');
list.innerHTML = '<li>Äpfel</li><li>Birnen</li><li>Kirschen</li>';
const items = list.querySelectorAll('li');
for (const index of items.keys()) {
console.log(index, items[index].textContent);
}
Indizes als Array sammeln
const div = document.createElement('div');
div.append(document.createElement('p'), document.createTextNode('Text'), document.createElement('span'));
const indices = [...div.childNodes.keys()];
console.log(indices);
Positionsnummern in data-Attribute schreiben
const rows = document.querySelectorAll('table tbody tr');
for (const i of rows.keys()) {
rows[i].dataset.position = String(i + 1);
if (i % 2 === 1) rows[i].classList.add('zebra');
}
console.log(`${rows.length} Zeilen nummeriert`);
Iterator manuell mit next() abfragen
const nodes = document.createElement('div');
nodes.innerHTML = '<b>a</b><i>b</i>';
const it = nodes.childNodes.keys();
console.log(it.next()); // erster Index
console.log(it.next()); // zweiter Index
console.log(it.next()); // fertig
// Wichtig · Fallstricke
- Live- oder statische Liste: Bei live-Listen wie
childNodeskönnen Knoten während der Iteration hinzukommen oder wegfallen. Das verschiebt die Indizes. Willst du beim Durchlaufen Knoten entfernen, erstelle vorher eine Kopie mitArray.from(list). - Nicht bei
HTMLCollection: Ergebnisse vongetElementsByClassName()oderchildrenhaben keinkeys(). Wandle sie mitArray.from(collection).keys()um. - Der Iterator lässt sich nur einmal durchlaufen. Für eine zweite Iteration rufst du
keys()erneut auf. - Die Schlüssel sind Zahlen, keine Strings (anders als bei
Object.keys()). - Kompatibilität: Wird von allen modernen Browsern unterstützt, aber nicht vom Internet Explorer. Dort hilft eine klassische
for-Schleife überlength.