Ich verstehe, dass IE8 Zugriff auf die Methode Array.prototype.slice
hat. Aber wenn ich versuche, ein NodeList
in ein Array umzuwandeln, bekomme ich den Fehler Array.prototype.slice: 'this' is not a JavaScript object
. Sie können es hier ausprobieren , oder sehen Sie sich meinen Code hier an:
HTML
%Vor%JavaScript
%Vor%Was ist hier los?
Update: Ein NodeList
kann in gewisser Weise wie ein Array behandelt werden - Sie muss eigentlich nichts Spezielles damit machen, bevor man es überschleifen kann, zum Beispiel:
Dadurch wird ein Array mit allen Knoten erstellt, die beim Ausführen von document.getElementsByTagName()
Siehe diese Frage für eine vollständige Erklärung, warum slice
in einigen Browsern mit einem NodeList
arbeitet, aber nicht in anderen, aber es kocht diesen Satz aus der Spezifikation:
Ob die Slice-Funktion erfolgreich auf ein Host-Objekt angewendet werden kann, hängt von der Implementierung ab.
Die Fehlermeldung ist korrekt - Ihre Nodelist ist kein JavaScript-Objekt, es ist ein " Host-Objekt ", das Sie kann nicht unbedingt wie normale JavaScript-Objekte umgehen. Führen Sie diesen Code in der JavaScript-Konsole des IE8 aus:
%Vor% Es gibt false
zurück.
Ich nehme an, dass Sie den gleichen Inhalt beibehalten möchten, selbst wenn sich die NodeList-Gruppe ändert.
Wenn es so ist, schlechte Nachrichten: IE8 ist kaputt. Und es kann nicht mit Slice auf NodeList umgehen.
Sie müssen also ein Fallback verwenden und das "Slice" selbst erstellen, wenn das Slice fehlschlägt (indem Sie try / catch verwenden).
Wenn Sie nicht erwarten, dass sich das DOM ändert, und wenn ein Array-ähnliches Objekt ausreicht, dann können Sie einfach die NodeList wie jedes andere Array verwenden (außer dass es nicht ist, und das wird es vielleicht sein) geändert, wenn das DOM sich ändert).
[edit] Eigentlich ist es kein gebrochenes Design, es ist vom Standard erlaubt (wie in dem Link in Kelvin Mackays Kommentar angegeben)
Die Verwendung von Array.prototype.slice
zum Konvertieren von NodeList
in Array funktioniert aus folgenden Gründen nicht:
slice
gibt die vorhandenen Array-Elemente zurück.
Array.prototype
ist keine Instanz von Array
object. Es handelt sich lediglich um einen Objektcontainer mit Eigenschaften, der von allen Objektinstanzen Array
geerbt wird. Es hat also nicht den tatsächlichen Array-Wert.
Die Konvertierung von NodeList
oder HTMLCollection
in ein Array erfolgt normalerweise mit for...
loop. Es kann aber auch mit dem dynamisch erstellten Array disposable erfolgen:
Sie können auch einen gebundenen Aufruf einer Methode aus Array.prototype
verwenden, obwohl dies ungewöhnlich ist und keine empfohlene Methode ist. Das folgende Beispiel ist im Grunde das gleiche wie oben.
Tags und Links javascript arrays dom nodelist prototype