Ich bin Javascript-Anfänger.
Ich starte eine Webseite über die window.onload
, ich muss eine Reihe von Elementen anhand ihres Klassennamens ( slide
) finden und sie basierend auf einer bestimmten Logik auf verschiedene Knoten verteilen. Ich habe eine Funktion, Distribute(element)
die ein Element als Eingabe nimmt und die Verteilung übernimmt. Ich möchte so etwas tun (wie zum Beispiel hier oder hier beschrieben ):
var slides = getElementsByClassName("slide");
for(var i = 0; i < slides.length; i++)
{
Distribute(slides[i]);
}
Dies macht jedoch nicht die Magie für mich, weil getElementsByClassName
nicht tatsächlich Array zurückgibt, sondern ein NodeList
, was ...
... das ist meine Spekulation ...
... innerhalb der Funktion geändert werden Distribute
(der DOM-Baum wird innerhalb dieser Funktion geändert und das Klonen bestimmter Knoten erfolgt). For-each
Schleifenstruktur hilft auch nicht.
Die variablen Folien wirken wirklich undeterministisch, da sie bei jeder Iteration die Länge und Reihenfolge der Elemente stark ändern.
Was ist in meinem Fall der richtige Weg, um NodeList zu durchlaufen? Ich habe darüber nachgedacht, ein temporäres Array zu füllen, bin mir aber nicht sicher, wie ich das machen soll ...
BEARBEITEN:
Eine wichtige Tatsache, die ich vergessen habe zu erwähnen, ist, dass sich möglicherweise eine Folie in einer anderen befindet. Dies ändert tatsächlich die slides
Variable, wie ich gerade dank Benutzer Alohci herausgefunden habe .
Die Lösung für mich bestand darin, jedes Element zuerst in ein Array zu klonen und das Array anschließend einzeln zu übergeben Distribute()
.
quelle
Distribute()
Funktion ist zu lang und komplex, um hier kopiert zu werden, aber ich bin sicher, dass ich die DOM-Struktur im Inneren ändere und dort auch Elemente dupliziere (klone). Wenn ich es debugge, kann ich sehen, dass sich die Variablenslides
jedes Mal ändern, wenn sie übergeben werden.getElementsByClassName()
ein Live zurückgibt. WennnodeList
also Elemente mit dieser Klasse hinzugefügt werden,nodeList
ändert sich die Länge der Änderungen, über die Sie iterieren.Antworten:
Laut MDN ist der Weg, um ein Element von einem abzurufen ,
NodeList
:So:
Ich habe es nicht selbst versucht (die normale
for
Schleife hat immer für mich funktioniert), aber probieren Sie es aus.quelle
for(var el in document.getElementsByClassName("foo")){}
?for ... of
ermöglicht es Ihnen, jetzt wie in über NodeList zu iterierenfor (slide of slides) Distribute(slide)
. Die Browserunterstützung ist lückenhaft, aber wenn Sie transpilieren,for ... of
wird sie konvertiert,NodeList.forEach
würde es aber nicht.Wenn Sie den neuen querySelectorAll verwenden, können Sie forEach direkt aufrufen.
Gemäß dem Kommentar unten. nodeLists haben keine forEach-Funktion.
Wenn Sie dies mit babel verwenden, können Sie hinzufügen
Array.from
und es werden Nicht-Knotenlisten in ein forEach-Array konvertiert.Array.from
funktioniert nicht nativ in Browsern unten und einschließlich IE 11.Bei unserem Treffen gestern Abend habe ich einen anderen Weg gefunden, um mit Knotenlisten umzugehen, die kein forEach haben
Browser-Unterstützung für [...]
Anzeige als Knotenliste
Als Array anzeigen
quelle
if ( !NodeList.prototype.forEach ) {NodeList.prototype.forEach = Array.prototype.forEach;}
[...document.getElementsByClassName('.edit')].forEach(function(button) {
[...document.getElementsByClassName('edit')].forEach(function(button) {
Sie können immer Array-Methoden verwenden:
quelle
Ich folgte Alohcis Empfehlung, in umgekehrter Reihenfolge zu schleifen, weil es ein Live ist
nodeList
. Folgendes habe ich für diejenigen getan, die neugierig sind ...quelle
quelle
Ich hatte ein ähnliches Problem mit der Iteration und bin hier gelandet. Vielleicht macht auch jemand anderes den gleichen Fehler wie ich.
In meinem Fall war der Selektor überhaupt nicht das Problem. Das Problem war, dass ich den Javascript-Code durcheinander gebracht hatte: Ich hatte eine Schleife und eine Unterschleife. Die Unterschleife wurde
i
stattdessen auch als Zähler verwendet.j
Da die Unterschleife den Werti
der Hauptschleife überschrieb , gelangte diese nie zur zweiten Iteration.quelle