Ich versuche eine einfache Schleife zu machen:
const parent = this.el.parentElement
console.log(parent.children)
parent.children.forEach(child => {
console.log(child)
})
Aber ich bekomme folgenden Fehler:
VM384: 53 Nicht erfasster TypeError: parent.children.forEach ist keine Funktion
Obwohl parent.children
Protokolle:
Was könnte das Problem sein?
Hinweis: Hier ist eine JSFiddle .
javascript
ecmascript-6
vue.js
alexchenco
quelle
quelle
Antworten:
Erste Option: ForEach indirekt aufrufen
Das
parent.children
ist ein Array-ähnliches Objekt. Verwenden Sie die folgende Lösung:Das
parent.children
heißtNodeList
Typ, der ein Array wie Objekt ist , weil:length
Eigenschaft, die die Anzahl der Knoten angibt{0: NodeObject, 1: NodeObject, length: 2, ...}
Weitere Details finden Sie in diesem Artikel .
Zweite Option: Verwenden Sie das iterierbare Protokoll
parent.children
ist einHTMLCollection
: das das iterierbare Protokoll implementiert . In einer ES2015-Umgebung können Sie dieHTMLCollection
mit jeder Konstruktion verwenden, die iterables akzeptiert.Verwendung
HTMLCollection
mit dem Spread-Operator:Oder mit dem
for..of
Zyklus (was meine bevorzugte Option ist):quelle
parent.children
ist kein Array. Es ist HTMLCollection und es gibt keineforEach
Methode. Sie können es zuerst in das Array konvertieren. Zum Beispiel in ES6:oder mit dem Spread-Operator:
quelle
parent.children
gibt eineKnotenlistenliste zurück, technisch gesehen eine HTML-Sammlung . Das ist ein Array-ähnliches Objekt, aber kein Array. Sie können also keine Array-Funktionen direkt darüber aufrufen. In diesem Kontext können Sie diesArray.from()
in ein reales Array konvertieren.quelle
Eine naivere Version, zumindest sind Sie sicher, dass sie auf allen Geräten ohne Konvertierung und ES6 funktioniert:
https://jsfiddle.net/swb12kqn/5/
quelle
parent.children
ist einHTMLCollection
Array-ähnliches Objekt. Zuerst müssen Sie es in eine reale konvertierenArray
, umArray.prototype
Methoden zu verwenden .quelle
Das ist , weil
parent.children
ein NodeList , und es nicht die unterstützt.forEach
Methode (wie ein Array NodeList artige Struktur ist , aber kein Array), so versuchen , es zu nennen , indem sie zuerst auf Array - Umwandlung unter Verwendung vonquelle
Es ist nicht erforderlich
forEach
, Sie können nur mit demfrom
zweiten Parameter des ' iterieren , wie folgt :quelle
Array.from
das im ersten Parameter angegebene Objekt in ein Array konvertiert wird. Das Ergebnis ist das gleiche wie in der Antwort von madox2, ohne dass eine zusätzlicheforEach
Schleife (Array.from
MDN- Dokumente) erforderlich ist .Wenn Sie versuchen, eine Schleife
NodeList
wie folgt zu erstellen :Ich kann Loop so empfehlen:
Persönlich habe ich verschiedene Möglichkeiten ausprobiert, aber die meisten haben nicht funktioniert, da ich eine Schleife durchlaufen wollte
NodeList
, aber diese funktioniert wie ein Zauber, probieren Sie es aus!Das
NodeList
ist kein Array, aber wir behandeln es als Array. Verwenden SieArray.
also. Sie müssen wissen, dass es in älteren Browsern nicht unterstützt wird!Benötigen Sie weitere Informationen über
NodeList
? Bitte lesen Sie die Dokumentation zu MDN .quelle
Da Sie Funktionen von ES6 ( Pfeilfunktionen ) verwenden, können Sie auch einfach eine for-Schleife wie die folgende verwenden:
quelle
Sie können überprüfen, ob Sie forEach richtig eingegeben haben. Wenn Sie foreach wie in anderen Programmiersprachen eingegeben haben, funktioniert dies nicht.
quelle
Sie können
childNodes
anstelle von verwendenchildren
,childNodes
ist auch zuverlässiger unter Berücksichtigung von Browserkompatibilitätsproblemen, weitere Informationen hier :oder mit dem Spread-Operator:
quelle