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 getElementsByClassName
realidad 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-each
La 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 slides
variable 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 variableslides
cambia 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 longitudnodeList
sobre la que está iterando cambia.Respuestas:
Según MDN, la forma de recuperar un artículo de un
NodeList
es:Así:
No lo he probado yo mismo (el
for
bucle normal siempre me ha funcionado), pero pruébalo.fuente
for(var el in document.getElementsByClassName("foo")){}
?for ... of
le 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.forEach
no 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.from
y convertirá listas de nodos en una matriz forEach.Array.from
no 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
i
como contador, en lugar dej
, así que debido a que el subloop estaba anulando el valor deli
bucle principal, este nunca llegó a la segunda iteración.fuente