Es ist, weil items
bezieht sich auf eine "Live-Liste". Das bedeutet, dass Aktualisierungen des DOM in Ihrer Liste wiedergegeben werden, wenn sie mit dem ursprünglichen Selektor übereinstimmen.
Da Sie eine div
anhängen und Ihr Selektor alle Elemente auswählt, wird er zur Liste hinzugefügt, wobei alle nachfolgenden Mitglieder einen Index nach oben schieben, und so wird die Iteration fortgesetzt.
Um dies zu vermeiden, erstellen Sie vor dem Iterieren eine Nicht-Live-Kopie der Sammlung.
var items = Array.from(document.getElementsByTagName("*"));
Und FYI, kann die if (!(items[i].nodeType == 3)){
entfernt werden, da getElementsByTagName
nie Textknoten zurück.
Wenn Sie sehr alte Versionen von IE unterstützen, möchten Sie vielleicht überprüfen, dass die .nodeType === 1
, da einige dieser alten Versionen Kommentarknoten bei der Verwendung "*"
enthalten.
Schließlich können Sie moderne Funktionen verwenden, um dies ein wenig aufzuräumen.
document.addEventListener('DOMContentLoaded',() => {
for (const el of [...document.getElementsByTagName("*")]) {
var newDiv = el.appendChild(document.createElement("div"));
// Work with newDiv
}
});
Wow fantastisch, perfekt funktioniert nicht versuchen, alle Elemente entsprechen oder sollten Sie eine andere Methode für das Erhalten der Elemente verwenden, die nicht eine Live-Knotenliste zurückgibt! Wie funktioniert Zeile 2? Wie ist es das "Live" -Problem losgeworden? –
@EricNelson: Schön, dass es geholfen hat. Das 'Array.from()' ist einfach ein Dienstprogramm, das jedes Array-ähnliche Objekt in ein tatsächliches Array umwandelt, das nicht die "Live" -Eigenschaften aufweist. Die '[... Sammlung]' Syntax ist ähnlich. Es ist nur die Array-Literalsyntax, verwendet aber die "..." -Streuungssyntax, um die Sammlung in das Array zu kopieren, das erstellt wird. –