Signatur
Beschreibung
Die Methode detach() eines NodeIterator-Objekts hatte früher eine Aufgabe: Nach dem Aufruf galt der Iterator als „abgekoppelt“. Der Browser konnte die zugehörigen Ressourcen freigeben, und weitere Aufrufe von nextNode() oder previousNode() lösten eine InvalidStateError-Ausnahme aus.
Laut aktuellem DOM Living Standard ist detach() nur noch ein No-op, also eine Methode ohne Wirkung. Sie gibt nichts zurück und ändert den Zustand des Iterators nicht. Der Iterator funktioniert danach ganz normal weiter. Speicher wird automatisch von der Garbage Collection freigegeben, sobald keine Referenz mehr auf den Iterator besteht.
Brauchen wirst du die Methode nur, wenn du alten Code liest oder wartest. In neuem Code solltest du sie nicht mehr aufrufen. Wenn du einen Iterator nicht mehr brauchst, lösche einfach die Referenz darauf, zum Beispiel mit iterator = null oder indem die Variable ihren Gültigkeitsbereich verlässt.
Rückgabewert
undefined zurück und hat keine Nebenwirkungen.Beispiele
detach() hat keine Wirkung: Der Iterator läuft weiter
// Iterator über alle Elemente im body erzeugen
const iterator = document.createNodeIterator(
document.body,
NodeFilter.SHOW_ELEMENT
);
const first = iterator.nextNode();
console.log(first.nodeName);
// Früher wurde der Iterator dadurch unbrauchbar, heute passiert nichts
const result = iterator.detach();
console.log(result);
// Weiteres Iterieren funktioniert ohne Fehler
const second = iterator.nextNode();
console.log(second !== null);
Alter Code gegenüber moderner Variante
// Alter Stil (vor dem DOM Living Standard):
const collectTextOld = (root) => {
const it = document.createNodeIterator(root, NodeFilter.SHOW_TEXT);
const texts = [];
let node;
while ((node = it.nextNode())) texts.push(node.nodeValue.trim());
it.detach(); // überflüssig, stört aber nicht
return texts.filter(Boolean);
};
// Moderner Stil: detach() weglassen, die Garbage Collection räumt auf
const collectText = (root) => {
const it = document.createNodeIterator(root, NodeFilter.SHOW_TEXT);
const texts = [];
for (let node = it.nextNode(); node; node = it.nextNode()) {
const t = node.nodeValue.trim();
if (t) texts.push(t);
}
return texts;
};
const box = document.createElement('div');
box.innerHTML = '<p>Hallo</p><p>Welt</p>';
console.log(collectTextOld(box), collectText(box));
Aufruf absichern, falls die Methode einmal entfernt wird
const it = document.createNodeIterator(document.documentElement);
// Nur aufrufen, wenn es die Methode gibt
if (typeof it.detach === 'function') {
it.detach();
}
console.log('Iterator weiterhin nutzbar:', it.nextNode() !== null);
// Wichtig · Fallstricke
- Veraltet: Die Methode existiert nur noch aus Gründen der Kompatibilität. Rufe sie in neuem Code nicht mehr auf. Linter und die MDN-Dokumentation führen sie als veraltet (deprecated).
- Anderes Verhalten als früher: Sehr alte Browser, etwa Firefox vor Version 30 und alte WebKit-Versionen, haben nach
detach()bei jedem weiteren Zugriff eineInvalidStateError-Ausnahme ausgelöst. Wenn Code sich auf diesen Fehler verlässt, um das Ende einer Iteration zu erkennen, funktioniert er heute nicht mehr. - Speicher freigeben:
detach()gibt keinen Speicher frei. Entferne stattdessen alle Referenzen auf den Iterator. - Andere Schnittstellen:
TreeWalkerhat überhaupt keine Methodedetach().Range.detach()ist ebenfalls ein No-op.