Soy un principiante de Javascript.
Estoy ingresando a la página web a través de window.onload, tengo que encontrar un montón de elementos por su nombre de clase ( slide) y redistribuirlos en diferentes nodos según la lógica. Tengo una función Distribute(element)que toma un elemento como entrada y realiza la distribución. Quiero hacer algo como esto (como se describe, por ejemplo, aquí o aquí ):
var slides = getElementsByClassName("slide");
for(var i = 0; i < slides.length; i++)
{
Distribute(slides[i]);
}
sin embargo, esto no me hace la magia, porque en getElementsByClassNamerealidad no devuelve una matriz, sino a NodeList, que es ...
... esta es mi especulación ...
... se cambia dentro de la función Distribute(el árbol DOM se cambia dentro de esta función y se produce la clonación de ciertos nodos). For-eachLa estructura de bucle tampoco ayuda.
Las diapositivas variables actúan de manera no determinista, a través de cada iteración cambia su longitud y orden de los elementos de manera salvaje.
¿Cuál es la forma correcta de iterar a través de NodeList en mi caso? Estaba pensando en llenar una matriz temporal, pero no estoy seguro de cómo hacerlo ...
EDITAR:
Un hecho importante que olvidé mencionar es que puede haber una diapositiva dentro de otra, esto es en realidad lo que cambia la slidesvariable como acabo de descubrir gracias al usuario Alohci .
La solución para mí fue clonar cada elemento en una matriz primero y pasar la matriz uno por uno Distribute()después.
fuente

Distribute()función es demasiado larga y compleja para copiarla aquí, pero estoy seguro de que estoy cambiando la estructura DOM interna, también estoy duplicando (clonando) elementos allí. Cuando lo depuro, puedo ver que la variableslidescambia cada vez que se pasa al interior.getElementsByClassName()devuelve un livenodeList, por lo que a medida que los elementos con esa clase se agregan, la longitudnodeListsobre la que está iterando cambia.Respuestas:
Según MDN, la forma de recuperar un artículo de un
NodeListes:Así:
No lo he probado yo mismo (el
forbucle normal siempre me ha funcionado), pero pruébalo.fuente
for(var el in document.getElementsByClassName("foo")){}?for ... ofle permite iterar sobre NodeList ahora como enfor (slide of slides) Distribute(slide). La compatibilidad con el navegador es irregular, pero si está transpilandofor ... of, se convertirá, peroNodeList.forEachno lo hará.Si usa el nuevo querySelectorAll, puede llamar a forEach directamente.
Según el comentario a continuación. nodeLists no tiene una función forEach.
Si usa esto con babel, puede agregar
Array.fromy convertirá listas de nodos en una matriz forEach.Array.fromno funciona de forma nativa en los navegadores siguientes e incluido IE 11.En nuestra reunión de anoche, descubrí otra forma de manejar las listas de nodos sin tener forEach
Soporte de navegador para [...]
Mostrando como lista de nodos
Mostrando como matriz
fuente
if ( !NodeList.prototype.forEach ) {NodeList.prototype.forEach = Array.prototype.forEach;}[...document.getElementsByClassName('.edit')].forEach(function(button) {[...document.getElementsByClassName('edit')].forEach(function(button) {Siempre puedes usar métodos de matriz:
fuente
Seguí Alohci recomendación del bucle en sentido inverso, porque es un vivo 's
nodeList. Esto es lo que hice por aquellos que tienen curiosidad ...fuente
fuente
Tuve un problema similar con la iteración y aterricé aquí. Quizás alguien más también esté cometiendo el mismo error que yo.
En mi caso, el selector no fue el problema en absoluto. El problema era que había estropeado el código javascript: tenía un bucle y un subloop. El subloop también se estaba usando
icomo contador, en lugar dej, así que debido a que el subloop estaba anulando el valor delibucle principal, este nunca llegó a la segunda iteración.fuente