Ich möchte einige DOM-Elemente durchlaufen. Ich mache Folgendes:
document.getElementsByClassName( "myclass" ).forEach( function(element, index, array) {
//do stuff
});
aber ich bekomme eine Fehlermeldung:
document.getElementsByClassName ("myclass"). forEach ist keine Funktion
Ich bin mit Firefox 3 , so ich , dass beide wissen , getElementsByClassName
und Array.forEach
vorhanden sind. Das funktioniert gut:
[2, 5, 9].forEach( function(element, index, array) {
//do stuff
});
Ist das Ergebnis getElementsByClassName
eines Arrays? Wenn nicht, was ist das?
quelle
[].forEach.call(elsArray, function () {...})
.querySelectorAll
Methode gibt jedoch eine NodeList zurück.document.getElementsByClassName()
sollHTMLCollection
(was sehr ähnlich ist, aber keine NodeList). Vielen Dank, dass Sie auf den Fehler hingewiesen haben.HTMLCollection
Tipp. Jetzt kann ich endlichHTMLCollection.prototype.forEach = Array.prototype.forEach;
meinen Code verwenden.Sie können verwenden
Array.from
, um Sammlung in Array zu konvertieren, was viel sauberer ist alsArray.prototype.forEach.call
:In älteren Browsern, die dies nicht unterstützen
Array.from
, müssen Sie etwas wie Babel verwenden.ES6 fügt auch diese Syntax hinzu:
Die Rest-Destrukturierung
...
funktioniert mit allen Array-ähnlichen Objekten, nicht nur mit den Arrays selbst. Dann wird eine gute alte Array-Syntax verwendet, um ein Array aus den Werten zu erstellen.Während die alternative Funktion
querySelectorAll
(die irgendwiegetElementsByClassName
veraltet ist) eine Sammlung zurückgibt, dieforEach
nativ vorhanden ist, fehlen andere Methodenmap
oderfilter
fehlen, sodass diese Syntax immer noch nützlich ist:quelle
Oder Sie können verwenden,
querySelectorAll
welche NodeList zurückgibt :Unterstützt von modernen Browsern (einschließlich Edge, aber nicht IE):
Kann ich querySelectorAll NodeList.prototype.forEach () verwenden?
MDN: Document.querySelectorAll ()
quelle
Bearbeiten: Obwohl sich der Rückgabetyp in neuen HTML-Versionen geändert hat (siehe Tim Downs aktualisierte Antwort), funktioniert der folgende Code weiterhin.
Wie andere gesagt haben, ist es eine NodeList. Hier ist ein vollständiges, funktionierendes Beispiel, das Sie ausprobieren können:
Dies funktioniert in IE 9, FF 5, Safari 5 und Chrome 12 unter Win 7.
quelle
Das Ergebnis von
getElementsByClassName()
ist kein Array, sondern ein Array-ähnliches Objekt . Insbesondere heißt es einHTMLCollection
, nicht zu verwechseln mitNodeList
( das hat seine eigeneforEach()
Methode ).Eine einfache Möglichkeit mit ES2015, ein Array-ähnliches Objekt für die Verwendung zu konvertieren
Array.prototype.forEach()
, das noch nicht erwähnt wurde, ist die Verwendung des Spread-Operators oder der Spread-Syntax :quelle
Nein
Wie bei allen DOM-Methoden, die mehrere Elemente zurückgeben, handelt es sich um eine NodeList (siehe https://developer.mozilla.org/en/DOM/document.getElementsByClassName)
quelle
Wie bereits erwähnt, wird
getElementsByClassName
eine HTMLCollection zurückgegeben , die als definiert istZuvor haben einige Browser stattdessen eine NodeList zurückgegeben .
Der Unterschied ist wichtig, weil DOM4 jetzt definiert NodeList s als iterable.
Laut Web IDL- Entwurf
Das bedeutet, dass Sie, wenn Sie verwenden möchten,
forEach
eine DOM-Methode verwenden können, die eine NodeList zurückgibt , wie zquerySelectorAll
.Beachten Sie, dass dies noch nicht allgemein unterstützt wird. Siehe auch für jede Methode von Node.childNodes?
quelle
forEach in not a function
document.querySelectorAll(...).forEach is not a function
Es gibt kein zurück
Array
, es gibt ein zurück NodeList .quelle
Dies ist der sicherere Weg:
quelle
getElementsByClassName
kehrt HTMLCollection in modernen Browsern.Dies ist ein Array-ähnliches Objekt, das Argumenten ähnelt, die durch eine
for...of
Schleife iteriert werden können. Siehe unten, was das MDN- Dokument dazu sagt:Beispiel
quelle
error TS2488: Type 'HTMLCollectionOf<Element>' must have a '[Symbol.iterator]()' method that returns an iterator.
Hier ist ein Test, den ich auf jsperf erstellt habe: https://jsperf.com/vanillajs-loop-through-elements-of-class
Die leistungsstärkste Version in Chrome und Firefox ist die gute alte for-Schleife in Kombination mit document.getElementsByClassName:
In Safari ist diese Variante der Gewinner:
Wenn Sie die leistungsstärkste Variante für alle Browser wünschen, ist dies möglicherweise die folgende:
quelle