Sou iniciante em Javascript.
Estou iniciando uma página da web através do window.onload
, tenho que encontrar um monte de elementos por seu nome de classe ( slide
) e redistribuí-los em nós diferentes com base em alguma lógica. Tenho uma função Distribute(element)
que pega um elemento como entrada e faz a distribuição. Eu quero fazer algo assim (conforme descrito, por exemplo, aqui ou aqui ):
var slides = getElementsByClassName("slide");
for(var i = 0; i < slides.length; i++)
{
Distribute(slides[i]);
}
no entanto, isso não faz a mágica para mim, porque getElementsByClassName
na verdade não retorna array, mas um NodeList
, que é ...
... esta é minha especulação ...
... sendo alterado dentro da função Distribute
(a árvore DOM está sendo alterada dentro desta função, e a clonagem de certos nós acontece). For-each
a estrutura do loop também não ajuda.
Os slides variáveis agem de forma realmente desdeterminista, através de cada iteração, ele muda o comprimento e a ordem dos elementos descontroladamente.
Qual é a maneira correta de iterar por meio de NodeList no meu caso? Eu estava pensando em preencher algum array temporário, mas não tenho certeza de como fazer isso ...
EDITAR:
fato importante que esqueci de mencionar é que pode haver um slide dentro do outro, isso é realmente o que muda a slides
variável como acabei de descobrir graças ao usuário Alohci .
A solução para mim foi clonar cada elemento em uma matriz primeiro e passar a matriz ono-por-um para Distribute()
depois.
fonte
Distribute()
função é muito longa e complexa para ser copiada aqui, mas tenho certeza de que estou alterando a estrutura do DOM dentro, também estou duplicando (clonando) elementos lá. Quando eu depuro, posso ver asslides
mudanças de variáveis sempre que é passado para dentro.getElementsByClassName()
retorna um livenodeList
, então como os elementos com essa classe são adicionados, o comprimento donodeList
over no qual você está iterando as alterações.Respostas:
De acordo com o MDN, a maneira de recuperar um item de um
NodeList
é:Portanto:
Eu não tentei fazer isso sozinho (o
for
loop normal sempre funcionou para mim), mas tente .fonte
for(var el in document.getElementsByClassName("foo")){}
?for ... of
permite que você itere em NodeList agora como emfor (slide of slides) Distribute(slide)
. O suporte do navegador é irregular, mas se você estiver transpilando,for ... of
será convertido, masNodeList.forEach
não será.Se você usar o novo querySelectorAll, poderá chamar forEach diretamente.
Conforme o comentário abaixo. nodeLists não tem uma função forEach.
Se usar isso com o babel, você pode adicionar
Array.from
e converter listas de não-nós em um array forEach.Array.from
não funciona nativamente nos navegadores abaixo e incluindo o IE 11.Em nosso encontro ontem à noite, descobri outra maneira de lidar com listas de nós, sem forEach
Suporte do navegador para [...]
Mostrando como lista de nós
Mostrando como matriz
fonte
if ( !NodeList.prototype.forEach ) {NodeList.prototype.forEach = Array.prototype.forEach;}
[...document.getElementsByClassName('.edit')].forEach(function(button) {
[...document.getElementsByClassName('edit')].forEach(function(button) {
Você sempre pode usar métodos de array:
fonte
Segui a recomendação de Alohci de fazer um loop reverso porque é um show
nodeList
. Aqui está o que fiz por quem está curioso ...fonte
fonte
Tive um problema semelhante com a iteração e caí aqui. Talvez outra pessoa também esteja cometendo o mesmo erro que eu.
No meu caso, o seletor não era o problema. O problema é que eu baguncei o código javascript: eu tinha um loop e um subloop. O subloop também estava usando
i
como um contador, em vez dej
, então, como o subloop estava substituindo o valor dei
do loop principal, este nunca chegou à segunda iteração.fonte