Mit forEach über ein array von getElementsByClassName Ergebnisse in "TypeError: undefined ist keine Funktion"
In mein JSFiddle, ich bin einfach zu versuchen, Sie zu iterieren über ein array von Elementen. Das array ist nicht leer, da die log-Anweisungen beweisen. Doch der Aufruf forEach
gibt mir die (nicht so hilfreich) "nicht Erfasste TypeError
: undefined
ist nicht eine Funktion" Fehler.
Ich muss etwas dumm, was mache ich falsch?
Mein code:
JS:
var arr = document.getElementsByClassName('myClass');
console.log(arr);
console.log(arr[0]);
arr.forEach(function(v, i, a) {
console.log(v);
});
CSS:
.myClass {
background-color: #FF0000;
}
HTML:
<div class="myClass">Hello</div>
arr
ist kein array, sondern einHTMLCollection
. Das es nicht die gleichen Methoden wie ein array. developer.mozilla.org/en-US/docs/Web/API/... . Hier ist SO ein post darüber auch: stackoverflow.com/questions/13433799/...- So etwas wie
[1,2,3].forEach(function(v,i,a) { console.log(v); });
ist in Ordnung. Was ist der Unterschied zwischen dieser und der array in meinem Beispiel? - Sie nicht eine array in deinem Beispiel. Was macht Sie denken, es ist ein array?
- die Tatsache, dass ich verwendet getElementsByClassName anderswo und iteriert über die es mit einer normalen for-Schleife. Sie lernen jeden Tag etwas neues!
- Ahh, dass ist es, was ich erwartete, Sie zu sagen. Also das ist ja, als dystroy zeigte in seiner Antwort, es gibt array-ähnliche Objekte, können "act" auf die gleiche Weise - mit Indizes für properties...was
getElementsByClassName
gibt - Als
arr instanceof Array
führtfalse
es nicht wahrnehmen kann jeder Prototyp Methoden derArray
Objekt wie - Array.der Prototyp.forEach().arr
ist ein HTMLCollection und ein array-Objekt wie (aber nicht Erben oder instanziierenArray
). Damit Ihre standard -for
Schleife funktioniert so, dass einfach durchläuft den index des Objekts und ist nicht ein PrototypArray
. - sollte sich die Unterschiede zwischen integrierten und host-Objekte. Erstere entsprechen ECMA-262, die später nur so viel, wie der Gastgeber wünscht. Der DOM hat viele Objekte, die es ermöglichen, Zugang zu den Mitgliedern, die durch den index (- Dokument.Bilder, Dokument.Formen, bilden.Elemente, wählen Sie.Optionen, etc.), meist basierend auf der NodeList-Schnittstelle.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil
document.getElementsByClassName
gibt eine HTMLCollection, und nicht ein array.Glücklicherweise ist es ein "array-artiges" Objekt (was erklärt, warum es protokolliert, als ob es ein Objekt und warum kann man die Iteration mit einem standard -
for
Schleife), so können Sie dies tun :Mit ES6 (auf modernen Browsern oder mit Babel), können Sie auch
Array.aus
die baut arrays aus array-ähnliche Objekte:oder Verbreitung der array-artiges Objekt in ein array:
foo[0]
aber nicht arrays?var a = {"0": "str1", "1": "str2", length: 2}
querySelectorAll('.myClass')
funktionieren sollte. Ich warte immer noch auf Iteratoren werden Hinzugefügt, um die NodeList-API. 🙁Array.prototype.forEach
lassen Sie nicht tun. Wenn Sie diese Anforderung später verwenden standard -for
Schleife oder, wenn Sie möchten, verwenden Sie das array-Objekt verwendenArray.prototype.every
oderArray.prototype.some
(beachten Sie aber, dass jeder/einige sind nicht unterstützt in IE8 oder weniger)slice
?slice
zu "kopieren"arguments
in ein array, aber ich hatte noch nie eine Notwendigkeit fürsplice
length
Eigenschaft. Aber ich habe auch gerade gelesen, Ihr "array-like" - Artikel, den Sie in Ihrer Antwort, und es erwähnt die Einbeziehung wichtigerArray.prototype
, so würde ich mehr alssplice
, aber dennoch sehe ich deinen Punkt benötigen, um die Struktur zu ändernsplice
in dieser definition ist aber, wenn ich will mehr sein "array-wie" nutzen zu könnenmap
,filter
, und so weiter, dann schließe ich es. Einfache iteration mitforEach
muss nichtsplice
.splice
, vor allem mitforEach
), aber auf jeden Fall das hinzufügen von Methoden wiemap
undfilter
helfen, wenn Sie Sie brauchen!Versuchen dieses sollte es funktionieren :
in der Veranstaltung, die Sie möchten, um Zugriff auf die ID für jedes element einer bestimmten Klasse können Sie Folgendes tun: