Signatur
Beschreibung
Element.children gibt eine lebendige HTMLCollection zurück. Sie enthält nur die direkten Kind-Elemente eines Elements. Text-, Kommentar- und Leerraumknoten sind nicht dabei. Das ist der wichtigste Unterschied zu Node.childNodes: Diese Eigenschaft liefert alle Knotentypen, also auch Zeilenumbrüche aus dem HTML-Quelltext.
Die Sammlung ist lebendig, sie bildet also immer den aktuellen Zustand des DOM ab. Fügt man ein Kind hinzu oder entfernt eines, ändern sich sofort length und die Indizes. Man greift per Index (children[0]), über item() oder über namedItem() auf die Einträge zu. namedItem() sucht nach id oder name.
Typische Anwendungsfälle sind das Durchlaufen von Listeneinträgen, Tabellenzeilen oder Kacheln, das Zählen von Kind-Elementen und der Zugriff auf das erste oder letzte Element. Für die beiden letzten Fälle gibt es auch die Abkürzungen firstElementChild und lastElementChild.
Rückgabewert
length === 0). Der Wert ist nie null.Beispiele
Kind-Elemente zählen und durchlaufen
// <ul id="menu">
// <li>Start</li>
// <li>Blog</li>
// <li>Kontakt</li>
// </ul>
const menu = document.getElementById('menu');
console.log(menu.children.length); // nur Elemente
console.log(menu.childNodes.length); // inkl. Leerraum-Textknoten
for (const item of menu.children) {
console.log(item.textContent);
}
Array-Methoden nutzen
const menu = document.getElementById('menu');
// HTMLCollection hat kein map/filter – daher erst in ein Array umwandeln
const labels = Array.from(menu.children, (li) => li.textContent.trim());
console.log(labels);
const active = [...menu.children].find((li) => li.textContent === 'Blog');
active?.classList.add('active');
Fallstrick: Entfernen in einer lebendigen Sammlung
const list = document.getElementById('menu');
// FALSCH: Durch jedes Entfernen verschieben sich die Indizes, jedes zweite Element bleibt übrig
// for (let i = 0; i < list.children.length; i++) list.children[i].remove();
// RICHTIG: rückwärts laufen ...
for (let i = list.children.length - 1; i >= 0; i--) {
list.children[i].remove();
}
// ... oder vorher eine statische Kopie anlegen:
// [...list.children].forEach((el) => el.remove());
console.log(list.children.length);
Zugriff per Index und namedItem()
// <form id="login"><input name="user"><input name="pass" type="password"></form>
const form = document.getElementById('login');
console.log(form.children[0].name); // erstes Kind
console.log(form.children.namedItem('pass').type); // Suche über name/id
console.log(form.children[5]); // Index außerhalb des Bereichs
// Wichtig · Fallstricke
- Lebendige Sammlung: Wer beim Durchlaufen Elemente entfernt oder einfügt, verändert die Sammlung während der Schleife. Deshalb vorher mit
Array.from()oder dem Spread-Operator kopieren oder rückwärts laufen. - Kein Array:
HTMLCollectionkennt wederforEachnochmapoderfilter.for...offunktioniert dagegen in allen modernen Browsern. - Nur direkte Kinder: Enkel und tiefer liegende Nachfahren sind nicht enthalten. Für diese nimmt man
querySelectorAll(), das allerdings eine statischeNodeListliefert. - Schreibgeschützt: Eine Zuweisung an
childrenhat keine Wirkung. Kinder ändert man mitappend(),replaceChildren()oderremove(). - Template-Inhalte: Bei
<template>liegen die Kinder intemplate.content.children, nicht intemplate.children. - Kompatibilität: Wird von allen modernen Browsern unterstützt.
childrengibt es auch aufDocumentundDocumentFragment(über dasParentNode-Mixin). Ältere Internet-Explorer-Versionen haben fälschlich Kommentarknoten mitgezählt.