Próbuję zapętlić WSZYSTKIE elementy na stronie, więc chcę sprawdzić każdy element, który istnieje na tej stronie, pod kątem specjalnej klasy.
Jak więc mam powiedzieć, że chcę sprawdzić KAŻDY element?
javascript
dom
Florian Müller
źródło
źródło
document.body.getElementsByTagName('*')
for (... of ...) { }
Odpowiedzi:
Możesz przekazać
*
do,getElementsByTagName()
aby zwróciło wszystkie elementy na stronie:Zauważ, że możesz użyć
querySelectorAll()
, jeśli jest dostępny (IE9 +, CSS w IE8), aby po prostu znaleźć elementy z określoną klasą.To z pewnością przyspieszyłoby sprawy nowoczesnych przeglądarek.
Przeglądarki obsługują teraz foreach w NodeList . Oznacza to, że możesz bezpośrednio zapętlić elementy zamiast pisać własną pętlę for.
źródło
all[i]
daje ci bieżący element.getElementsByClassName()
ma gorsze wsparcie niżquerySelectorAll()
(to pierwsze nie jest obsługiwane w IE 8). OP wyraźnie stwierdził, że chce zapętlić wszystkie elementy na stronie, dla czego dałem mu rozwiązanie i zaproponowałem alternatywę. Nie jestem pewien, w czym problem ;-).Szukałem tego samego. Cóż, nie do końca. Chciałem tylko wymienić wszystkie węzły DOM.
Aby uzyskać elementy o określonej klasie, możemy użyć funkcji filtru.
Znalazłem rozwiązanie na MDN
źródło
document.body.getElementsByTagName('*')
mogłyby zwrócić węzły w zakodowanej kolejności.Jak zawsze najlepszym rozwiązaniem jest użycie rekurencji:
W przeciwieństwie do innych sugestii, to rozwiązanie nie wymaga tworzenia tablicy dla wszystkich węzłów, więc ma więcej światła na pamięć. Co ważniejsze, znajduje więcej wyników. Nie jestem pewien, jakie to są wyniki, ale podczas testów na Chrome znajduje około 50% więcej węzłów w porównaniu z
document.getElementsByTagName("*");
źródło
document.getElementsByTagName("*");
” - tak, znajdzie węzły tekstowe i komentarze, a także węzły elementów . Ponieważ OP pytał tylko o elementy, to jest niepotrzebne.NodeList
po prostu odwołuje się doNode
s, które są już zbudowane w twoim DOM, więc nie jest tak ciężki, jak możesz sobie wyobrazić. Ktoś, kto wie więcej, może ważyć, ale myślę, że to tylko rozmiar odniesienia pamięci, więc 8 bajtów na węzeł.Oto kolejny przykład, jak można zapętlić dokument lub element:
źródło
Dla tych, którzy używają Jquery
źródło
Andy E. udzielił dobrej odpowiedzi.
Dodałbym, że jeśli chcesz zaznaczyć wszystkie dzieci w jakimś specjalnym selektorze (taka potrzeba mi się ostatnio zdarzyła), możesz zastosować metodę „getElementsByTagName ()” na dowolnym obiekcie DOM.
Na przykład musiałem po prostu przeanalizować „wizualną” część strony internetowej, więc właśnie to zrobiłem
To nigdy nie będzie uwzględniać części głowy.
źródło
z tego linku
odniesienie javascript
AKTUALIZACJA: EDYCJA
od czasu mojej ostatniej odpowiedzi znalazłem lepsze i prostsze rozwiązanie
źródło
document.all
odradza siędocument.getElementBy*
.Posługiwać się
*
źródło
myślę, że to jest naprawdę szybkie
źródło
Pobranie wszystkich elementów za pomocą
var all = document.getElementsByTagName("*"); for (var i=0, max=all.length; i < max; i++);
jest w porządku, jeśli chcesz sprawdzić każdy element, ale spowoduje sprawdzenie lub zapętlenie powtarzających się elementów lub tekstu.Poniżej znajduje się implementacja rekurencyjna, która sprawdza lub zapętla każdy element wszystkich elementów DOM tylko raz i dołącza:
(Podziękowania dla @George Reith za jego rekursywną odpowiedź tutaj: Mapuj HTML na JSON )
źródło
Możesz spróbować
document.getElementsByClassName('special_class');
źródło
getElementsByClassName()
i nie jest obsługiwana przez Internet Explorer do wersji 9.