Je suis débutant en Javascript.
J'ouvre la page Web via le window.onload
, je dois trouver un tas d'éléments par leur nom de classe ( slide
) et les redistribuer dans différents nœuds en fonction d'une logique. J'ai une fonction Distribute(element)
qui prend un élément comme entrée et fait la distribution. Je veux faire quelque chose comme ça (comme indiqué par exemple ici ou ici ):
var slides = getElementsByClassName("slide");
for(var i = 0; i < slides.length; i++)
{
Distribute(slides[i]);
}
cependant cela ne fait pas la magie pour moi, car getElementsByClassName
ne renvoie pas réellement de tableau, mais un NodeList
, qui est ...
... c'est ma spéculation ...
... en cours de modification à l'intérieur de la fonction Distribute
(l'arborescence DOM est modifiée à l'intérieur de cette fonction et le clonage de certains nœuds se produit). For-each
la structure en boucle n'aide pas non plus.
Les diapositives variables agissent de manière vraiment non déterministe, à chaque itération, elles changent énormément la longueur et l'ordre des éléments.
Quelle est la bonne façon d'itérer dans NodeList dans mon cas? Je pensais remplir un tableau temporaire, mais je ne sais pas comment faire cela ...
ÉDITER:
fait important que j'ai oublié de mentionner est qu'il pourrait y avoir une diapositive dans une autre, c'est en fait ce qui change la slides
variable comme je viens de le découvrir grâce à l'utilisateur Alohci .
La solution pour moi était de cloner chaque élément dans un tableau d' abord et passer le tableau ono par un dans la Distribute()
suite.
la source
Distribute()
fonction est trop longue et complexe pour être copiée ici, mais je suis certain que je change la structure DOM à l'intérieur, j'y duplique (clonage) également des éléments. Quand je le débogue, je peux voir lesslides
changements de variable chaque fois qu'il est passé à l'intérieur.getElementsByClassName()
renvoie un livenodeList
, donc à mesure que les éléments avec cette classe sont ajoutés, la longueur de la périodenodeList
sur laquelle vous itérez change.Réponses:
Selon MDN, la façon de récupérer un élément à partir d'un
NodeList
est:Donc:
Je n'ai pas essayé moi-même (la
for
boucle normale a toujours fonctionné pour moi), mais essayez-le .la source
for(var el in document.getElementsByClassName("foo")){}
?for ... of
vous permet d'itérer sur NodeList maintenant comme dansfor (slide of slides) Distribute(slide)
. La prise en charge du navigateur est inégale, mais si vous transpilez, ellefor ... of
sera convertie, maisNodeList.forEach
pas.Si vous utilisez le nouveau querySelectorAll, vous pouvez appeler forEach directement.
Par le commentaire ci-dessous. Les listes de nœuds n'ont pas de fonction forEach.
Si vous l'utilisez avec babel, vous pouvez ajouter
Array.from
et cela convertira les listes sans nœuds en un tableau forEach.Array.from
ne fonctionne pas de manière native dans les navigateurs ci-dessous et y compris IE 11.Lors de notre rencontre d'hier soir, j'ai découvert une autre façon de gérer les listes de nœuds n'ayant pas forEach
Prise en charge du navigateur pour [...]
Affichage sous forme de liste de nœuds
Affichage sous forme de tableau
la source
if ( !NodeList.prototype.forEach ) {NodeList.prototype.forEach = Array.prototype.forEach;}
[...document.getElementsByClassName('.edit')].forEach(function(button) {
[...document.getElementsByClassName('edit')].forEach(function(button) {
Vous pouvez toujours utiliser des méthodes de tableau:
la source
J'ai suivi la recommandation d' Alohci de boucler à l'envers car c'est un live
nodeList
. Voici ce que j'ai fait pour ceux qui sont curieux ...la source
la source
J'ai eu un problème similaire avec l'itération et j'ai atterri ici. Peut-être que quelqu'un d'autre fait aussi la même erreur que moi.
Dans mon cas, le sélecteur n'était pas du tout le problème. Le problème était que j'avais gâché le code javascript: j'avais une boucle et une sous-boucle. La sous-boucle était également utilisée
i
comme compteur, au lieu dej
, donc parce que la sous-boucle remplaçait la valeur dei
de la boucle principale, celle-ci n'a jamais atteint la deuxième itération.la source