Je travaillais sur un court script pour changer <abbr>
le texte intérieur des éléments, mais nodelist
j'ai trouvé qu'il n'avait pas de forEach
méthode. Je sais que nodelist
cela n'hérite pas de Array
, mais ne semble-t-il pas forEach
être une méthode utile à avoir? Y at - il un problème de mise en œuvre particulière , je ne suis pas au courant de cela empêche l' ajout forEach
de nodelist
?
Remarque: je suis conscient que Dojo et jQuery ont tous les deux forEach
une forme pour leurs listes de nœuds. Je ne peux pas utiliser non plus en raison de limitations.
javascript
arrays
dom
foreach
Serpents et café
la source
la source
Réponses:
NodeList a maintenant forEach () dans tous les principaux navigateurs
Voir nodeList forEach () sur MDN .
Réponse originale
Aucune de ces réponses n'explique pourquoi NodeList n'hérite pas de Array, ce qui lui permet d'avoir
forEach
et tout le reste.La réponse se trouve sur ce fil de discussion es-discuter . Bref, ça casse le web:
Autrement dit, un code a fait quelque chose comme
Cependant,
concat
traitera les tableaux "réels" (et non les instances de Array) différemment des autres objets:donc cela signifie que le code ci-dessus s'est cassé quand
x
était une NodeList, car avant de descendre dans ledoSomethingElseWith(x)
chemin, alors qu'après, il aotherArray.concat(x)
emprunté le chemin, ce qui a fait quelque chose de bizarre puisque cex
n'était pas un vrai tableau.Pendant un certain temps, il y avait une proposition pour une
Elements
classe qui était une vraie sous-classe d'Array, et serait utilisée comme "la nouvelle NodeList". Cependant, cela a été supprimé du standard DOM , du moins pour le moment, car il n'était pas encore possible de l'implémenter pour diverses raisons techniques et liées aux spécifications.la source
NodeList now has forEach() in all major browsers
à jour semble impliquer que IE n'est pas un navigateur majeur. J'espère que c'est vrai pour certaines personnes, mais ce n'est pas vrai pour moi (encore).Tu peux faire
la source
Array.prototype.forEach.call
peut être raccourci vers[].forEach.call
Array.prototype.forEach.call
, c'est créer un tableau vide et utiliser saforEach
méthode.Vous pouvez envisager de créer un nouveau tableau de nœuds.
Remarque: Ceci est juste une liste / un tableau de références de nœuds que nous créons ici, pas de nœuds en double.
la source
Array.prototype.forEach.call(nodeList, fun)
.var forEach = Array.prototype.forEach.call(nodeList, callback);
. Maintenant, vous pouvez simplement appelerforEach(nodeList, callback);
Ne dites jamais jamais, nous sommes en 2016 et l'
NodeList
objet a implémenté uneforEach
méthode dans le dernier chrome (v52.0.2743.116).Il est trop tôt pour l'utiliser en production car les autres navigateurs ne le prennent pas encore en charge (testé FF 49) mais je suppose que cela sera bientôt normalisé.
la source
Array.prototype.slice.call(nodelist).forEach(…)
ce qui est standard et fonctionne dans les anciens navigateurs.En bref, c'est un conflit de conception pour implémenter cette méthode.
De MDN:
Source: https://developer.mozilla.org/en-US/docs/DOM/NodeList ( faites défiler jusqu'à Pourquoi ne puis-je pas utiliser forEach ou map sur une NodeList? )
la source
myNodeList --> NodeList.prototype --> Array.prototype --> Object.prototype --> null
:?Si vous souhaitez utiliser forEach sur NodeList, copiez simplement cette fonction depuis Array:
C'est tout, maintenant vous pouvez l'utiliser de la même manière que vous le feriez pour Array:
la source
Dans ES2015, vous pouvez maintenant utiliser la
forEach
méthode pour le nodeList.Voir le lien MDN
Cependant, si vous souhaitez utiliser des collections HTML ou d'autres objets de type tableau, dans es2015, vous pouvez utiliser
Array.from()
method. Cette méthode prend un objet de type tableau ou itérable (y compris nodeList, HTML Collections, strings, etc.) et retourne une nouvelle instance Array. Vous pouvez l'utiliser comme ceci:Comme la
Array.from()
méthode est shimmable, vous pouvez l'utiliser dans le code es5 comme celui-ciPour plus de détails, consultez la page MDN .
Pour vérifier la prise en charge actuelle du navigateur .
OU
une autre façon es2015 est d'utiliser l'opérateur de propagation.
Opérateur de diffusion MDN
Spread Operator - Prise en charge du navigateur
la source
Ma solution:
la source
NodeList fait partie de l'API DOM. Regardez les liaisons ECMAScript qui s'appliquent également à JavaScript. http://www.w3.org/TR/DOM-Level-2-Core/ecma-script-binding.html . Le nodeList et une propriété de longueur en lecture seule et une fonction item (index) pour renvoyer un nœud.
La réponse est que vous devez itérer. Il n'y a pas d'alternative. Foreach ne fonctionnera pas. Je travaille avec des liaisons API Java DOM et j'ai le même problème.
la source
Dans IE, utilisez la réponse d'Akuhn :
la source