Próbuję zrobić prostą pętlę:
const parent = this.el.parentElement
console.log(parent.children)
parent.children.forEach(child => {
console.log(child)
})
Ale pojawia się następujący błąd:
VM384: 53 Uncaught TypeError: parent.children.forEach nie jest funkcją
Mimo że parent.children
dzienniki:
Jaki może być problem?
Uwaga: oto JSFiddle .
javascript
ecmascript-6
vue.js
alexchenco
źródło
źródło
Odpowiedzi:
Pierwsza opcja: wywołaj forEach pośrednio
parent.children
Jest tablicą jak przedmiot. Skorzystaj z następującego rozwiązania:Typ
parent.children
isNodeList
, który jest obiektem typu Array, ponieważ:length
właściwość, która wskazuje liczbę węzłów{0: NodeObject, 1: NodeObject, length: 2, ...}
Zobacz więcej szczegółów w tym artykule .
Druga opcja: użyj iterowalnego protokołu
parent.children
jestHTMLCollection
: który implementuje iterowalny protokół . W środowisku ES2015 można używaćHTMLCollection
z dowolną konstrukcją, która akceptuje elementy iteracyjne.Użyj
HTMLCollection
z operatorem rozprzestrzeniania:Lub z
for..of
cyklem (który jest moją preferowaną opcją):źródło
parent.children
nie jest tablicą. To jest HTMLCollection i nie maforEach
metody. Możesz najpierw przekonwertować go na tablicę. Na przykład w ES6:lub używając operatora rozprzestrzeniania:
źródło
parent.children
zwrócilistęlistywęzłów, technicznie rzecz biorąc, kolekcję html . Jest to obiekt podobny do tablicy, ale nie tablica, więc nie można bezpośrednio wywoływać funkcji tablicowych. W tym kontekście możesz użyćArray.from()
do przekonwertowania tego na prawdziwą tablicę,źródło
Bardziej naiwna wersja, przynajmniej masz pewność, że będzie działać na wszystkich urządzeniach, bez konwersji i ES6:
https://jsfiddle.net/swb12kqn/5/
źródło
parent.children
jestHTMLCollection
obiektem podobnym do tablicy. Najpierw musisz przekonwertować to na rzeczywiste,Array
aby użyćArray.prototype
metod.źródło
Dzieje się tak , ponieważ
parent.children
jest to lista NodeList i nie obsługuje.forEach
metody (ponieważ NodeList jest strukturą podobną do tablicy, ale nie tablicą), więc spróbuj ją wywołać, najpierw przekonwertując ją na tablicę za pomocąźródło
Nie ma potrzeby
forEach
, możesz iterować używając tylkofrom
drugiego parametru, na przykład:źródło
Array.from
konwertuje obiekt podany w pierwszym parametrze na tablicę. Wynik jest taki sam, jak w odpowiedzi madox2 bez potrzeby dodatkowejforEach
pętli ( dokumentacjaArray.from
MDN ).Jeśli próbujesz zapętlić coś
NodeList
takiego:Gorąco polecam zapętlić to w ten sposób:
Osobiście wypróbowałem kilka sposobów, ale większość z nich nie działała, ponieważ chciałem zapętlić nad a
NodeList
, ale ten działa jak urok, spróbuj!To
NodeList
nie jest tablica, ale traktujemy ją jako tablicę, używającArray.
Więc musisz wiedzieć, że nie jest obsługiwana w starszych przeglądarkach!Potrzebujesz więcej informacji
NodeList
? Przeczytaj jego dokumentację na MDN .źródło
Ponieważ używasz funkcji ES6 ( funkcji strzałkowych ), możesz po prostu użyć pętli for w następujący sposób:
źródło
Możesz sprawdzić, czy wpisałeś forEach poprawnie, jeśli wpisałeś foreach jak w innych językach programowania, to nie zadziała.
źródło
Możesz użyć
childNodes
zamiastchildren
,childNodes
jest również bardziej niezawodny, biorąc pod uwagę problemy ze zgodnością przeglądarki, więcej informacji tutaj :lub używając operatora rozprzestrzeniania:
źródło