Eu estava trabalhando em um pequeno script para alterar <abbr>
o texto interno dos elementos, mas descobri que nodelist
não tem um forEach
método. Eu sei que nodelist
não herda de Array
, mas não parece que forEach
seria um método útil? Existe um problema de implementação particular eu não tenho conhecimento de que impede a adição forEach
de nodelist
?
Nota: Estou ciente de que o Dojo e o jQuery têm forEach
, de alguma forma, suas listas de nós. Não posso usar nenhum deles devido a limitações.
javascript
arrays
dom
foreach
Cobras e Café
fonte
fonte
Respostas:
NodeList agora tem forEach () em todos os principais navegadores
Consulte nodeList forEach () em MDN .
Resposta original
Nenhuma dessas respostas explica por que NodeList não herda de Array, permitindo que ele tenha
forEach
e todo o resto.A resposta é encontrada neste tópico es-discuss . Resumindo, ele quebra a web:
Ou seja, algum código fez algo como
No entanto,
concat
tratará arrays "reais" (não instância de Array) de maneira diferente de outros objetos:então isso significa que o código acima quebrou quando
x
era um NodeList, porque antes ele desceu odoSomethingElseWith(x)
caminho, enquanto depois ele desceu ootherArray.concat(x)
caminho, o que fez algo estranho, já quex
não era um array real.Há algum tempo surgiu a proposta de uma
Elements
classe que fosse uma verdadeira subclasse de Array, e seria usada como "a nova NodeList". No entanto, isso foi removido do padrão DOM , pelo menos por enquanto, uma vez que ainda não era viável de implementar por uma variedade de razões técnicas e de especificação.fonte
NodeList now has forEach() in all major browsers
parece implicar que o IE não é um navegador importante. Espero que isso seja verdade para algumas pessoas, mas não é verdade para mim (ainda).Você pode fazer
fonte
Array.prototype.forEach.call
pode ser abreviado para[].forEach.call
Array.prototype.forEach.call
, é criar um array vazio e usar seuforEach
método.Você pode considerar a criação de uma nova matriz de nós.
Nota: Esta é apenas uma lista / array de referências de nós que estamos criando aqui, sem nós duplicados.
fonte
Array.prototype.forEach.call(nodeList, fun)
.var forEach = Array.prototype.forEach.call(nodeList, callback);
. Agora você pode simplesmente ligarforEach(nodeList, callback);
Nunca diga nunca, estamos em 2016 e o
NodeList
objeto implementou umforEach
método no Chrome mais recente (v52.0.2743.116).É muito cedo para usá-lo em produção porque outro navegador não suporta isso ainda (FF 49 testado), mas acho que isso será padronizado em breve.
fonte
Array.prototype.slice.call(nodelist).forEach(…)
que é padrão e funciona em navegadores antigos.Em suma, é um conflito de design para implementar esse método.
Do MDN:
Fonte: https://developer.mozilla.org/en-US/docs/DOM/NodeList (role para baixo até Por que não posso usar forEach ou mapear em um NodeList? )
fonte
myNodeList --> NodeList.prototype --> Array.prototype --> Object.prototype --> null
:?Se você quiser usar forEach em NodeList, apenas copie essa função do Array:
Isso é tudo, agora você pode usá-lo da mesma maneira que faria para Array:
fonte
No ES2015, agora você pode usar o
forEach
método para o nodeList.Veja o link MDN
No entanto, se você quiser usar coleções HTML ou outros objetos semelhantes a array, em es2015, você pode usar o
Array.from()
método. Este método pega um objeto semelhante a um array ou iterável (incluindo nodeList, coleções HTML, strings, etc.) e retorna uma nova instância de Array. Você pode usá-lo assim:Como o
Array.from()
método é shimmable, você pode usá-lo em código es5 como estePara obter detalhes, consulte a página MDN .
Para verificar o suporte do navegador atual .
OU
outra maneira es2015 é usar o operador de propagação.
Operador de spread MDN
Spread Operator - Suporte de navegador
fonte
Minha solução:
fonte
NodeList faz parte da API DOM. Observe as ligações ECMAScript que também se aplicam ao JavaScript. http://www.w3.org/TR/DOM-Level-2-Core/ecma-script-binding.html . O nodeList e uma propriedade de comprimento somente leitura e função de item (índice) para retornar um nó.
A resposta é: você precisa iterar. Não ha alternativa. Foreach não funcionará. Eu trabalho com ligações Java DOM API e tenho o mesmo problema.
fonte
No IE, use a resposta de akuhn :
fonte