Dans ES6, un iterable est un objet qui permet for... of
, et a une touche Symbol.iterator.
Les tableaux sont iterables, tout comme les ensembles et les cartes. La question est: les HTMLCollection et NodeList iterables ? Sont-ils supposés être?
La documentation de MDN semble suggérer qu'un NodeList
est NodeList
.
for...of
boucles seront sur les objets NodeList correctement, dans les navigateurs qui prennent en chargefor...of
(comme Firefox 13 et versions ultérieures)
- Vérifier si la fonction est un générateur
- Pourquoi l'instance ne fonctionne-t-elle pas sur les instances de sous-classes d'erreur sous babel-node?
- Accès à la propriété sans sécurité (et affectation conditionnelle) dans ES6 / 2015
- Abonnement à la modification de propriété avec Aurelia
- Obtenir le nom de classe de l'instance de classe ES6
Cela semble corroborer le comportement de Firefox.
J'ai testé le code suivant dans Chrome et Firefox, et j'ai été surpris de constater que Firefox semble penser qu'ils sont iterables, mais Chrome ne le fait pas. En outre, Firefox pense que les itérateurs renvoyés par HTMLCollection
et NodeList
sont identiques.
var col = document.getElementsByClassName('test'); // Should get HTMLCollection of 2 elems var nod = document.querySelectorAll('.test'); // Should get NodeList of 2 elems var arr = [].slice.call(col); // Should get Array of 2 elems console.log(col[Symbol.iterator]); // Firefox: iterator function, Chrome: undefined console.log(nod[Symbol.iterator]); // Firefox: iterator function, Chrome: undefined console.log(arr[Symbol.iterator]); // Firefox & Chrome: iterator function console.log(col[Symbol.iterator] === nod[Symbol.iterator]); // Firefox: true console.log(col[Symbol.iterator] === arr[Symbol.iterator]); // Firefox: false
<div class="test">1</div> <div class="test">2</div>
Une chose vraiment étrange et confuse : l'exécution de l'extrait de code produit un résultat différent de la copie et de l'exécution dans un fichier / console réel dans Firefox (en particulier la dernière comparaison). Toute illumination sur ce comportement étrange ici serait également appréciée.
Symbol.iterator
support de NodeList
pour NodeList
, HTMLCollection
, DOMTokenList
et DOMSettableTokenList
été discuté et ajouté aux spécifications DOM de WHATWG l' année dernière.
Malheureusement, pas encore. Mais jusqu'à ce qu'ils soient, vous pouvez facilement les appliquer comme suit:
HTMLCollection.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
Comme l'a souligné Symbol.iterator
support Symbol.iterator
de NodeList
pour NodeList
été ajouté à la spécification DOM de WHATWG en 2014.
Malheureusement, Chrome 51 est la première version de Chrome à l'appuyer, et son Beta vient d'être publié au moment de la rédaction de cette réponse. En outre, il n'y a aucun support dans aucune version d'Internet Explorer ou Edge.
Pour ajouter Symbol.iterator
support pour NodeList
dans tous les navigateurs à votre code, utilisez simplement le polyfill suivant:
NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];