"Array.prototype.slice: Dies ist kein JavaScript-Objekt" Fehler in IE8

8

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?

    
Aust 09.11.2012, 23:56
quelle

4 Antworten

8

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:

%Vor%

Dadurch wird ein Array mit allen Knoten erstellt, die beim Ausführen von document.getElementsByTagName()

übereinstimmten

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.

    
Kelvin 10.11.2012, 00:00
quelle
2

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.

    
gilly3 10.11.2012 00:17
quelle
0

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)

    
Maël Nison 10.11.2012 00:10
quelle
0

Die Verwendung von Array.prototype.slice zum Konvertieren von NodeList in Array funktioniert aus folgenden Gründen nicht:

    Die Methode
  • 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:

%Vor%

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.

%Vor%     
Jay 10.11.2012 00:43
quelle