J'essaye de faire une boucle simple:
const parent = this.el.parentElement
console.log(parent.children)
parent.children.forEach(child => {
console.log(child)
})
Mais j'obtiens l'erreur suivante:
VM384: 53 Uncaught TypeError: parent.children.forEach n'est pas une fonction
Même si les parent.children
journaux:
Quel pourrait être le problème?
Remarque: voici un JSFiddle .
javascript
ecmascript-6
vue.js
Alexchenco
la source
la source
Réponses:
Première option: invoquer forEach indirectement
Le
parent.children
est un objet de type Array. Utilisez la solution suivante:Le type
parent.children
isNodeList
, qui est un objet de type Array car:length
propriété, qui indique le nombre de nœuds{0: NodeObject, 1: NodeObject, length: 2, ...}
Voir plus de détails dans cet article .
Deuxième option: utiliser le protocole itérable
parent.children
est unHTMLCollection
: qui implémente le protocole itérable . Dans un environnement ES2015, vous pouvez utiliser leHTMLCollection
avec n'importe quelle construction qui accepte les itérables.Utilisation
HTMLCollection
avec l'opérateur d'étalement:Ou avec le
for..of
cycle (qui est mon option préférée):la source
parent.children
n'est pas un tableau. C'est HTMLCollection et il n'a pas deforEach
méthode. Vous pouvez d'abord le convertir en tableau. Par exemple dans ES6:ou en utilisant l'opérateur d'étalement:
la source
parent.children
renverra uneliste deliste denœuds, techniquement une collection html . C'est un tableau comme un objet, mais pas un tableau, vous ne pouvez donc pas appeler directement des fonctions de tableau dessus. Dans ce contexte, vous pouvez utiliserArray.from()
pour convertir cela en un véritable tableau,la source
Une version plus naïve , au moins vous êtes sûr que cela fonctionnera sur tous les appareils, sans conversion et ES6:
https://jsfiddle.net/swb12kqn/5/
la source
parent.children
est unHTMLCollection
objet de type tableau. Tout d'abord, vous devez le convertir en réelArray
pour utiliser desArray.prototype
méthodes.la source
C'est parce qu'il
parent.children
s'agit d'un NodeList , et qu'il ne prend pas en charge la.forEach
méthode (car NodeList est un tableau comme une structure mais pas un tableau), alors essayez de l'appeler en le convertissant d'abord en tableau en utilisantla source
Il n'y a pas besoin de l '
forEach
, vous pouvez itérer en utilisant uniquement lefrom
deuxième paramètre de, comme ceci:la source
Array.from
convertit l'objet donné dans le premier paramètre en un tableau. Le résultat est le même que dans la réponse de madox2 sans avoir besoin d'uneforEach
boucle supplémentaire ( documentationArray.from
MDN ).Si vous essayez de boucler sur un
NodeList
comme ceci:Je recommande fortement de le boucler de cette façon:
Personnellement, j'ai essayé plusieurs méthodes, mais la plupart d'entre elles n'ont pas fonctionné car je voulais en boucle sur un
NodeList
, mais celui-ci fonctionne comme un charme, essayez-le!Ce
NodeList
n'est pas un tableau, mais nous le traitons comme un tableau, en utilisantArray.
Donc, vous devez savoir qu'il n'est pas pris en charge dans les anciens navigateurs!Besoin de plus d'informations sur
NodeList
? Veuillez lire sa documentation sur MDN .la source
Puisque vous utilisez des fonctionnalités d'ES6 ( fonctions fléchées ), vous pouvez également simplement utiliser une boucle for comme celle-ci:
la source
Vous pouvez vérifier si vous avez tapé forEach correctement, si vous avez tapé foreach comme dans d'autres langages de programmation, cela ne fonctionnera pas.
la source
Vous pouvez utiliser à la
childNodes
place dechildren
,childNodes
est également plus fiable compte tenu des problèmes de compatibilité du navigateur, plus d'informations ici :ou en utilisant l'opérateur d'étalement:
la source