Jestem początkującym użytkownikiem Javascript.
Inicjuję stronę internetową za pośrednictwem window.onload
, muszę znaleźć grupę elementów według nazwy ich klasy ( slide
) i ponownie rozdzielić je na różne węzły w oparciu o jakąś logikę. Mam funkcję, Distribute(element)
która przyjmuje element jako dane wejściowe i wykonuje dystrybucję. Chcę zrobić coś takiego (jak opisano na przykład tutaj lub tutaj ):
var slides = getElementsByClassName("slide");
for(var i = 0; i < slides.length; i++)
{
Distribute(slides[i]);
}
jednak nie robi to dla mnie magii, ponieważ getElementsByClassName
tak naprawdę nie zwraca tablicy, ale a NodeList
, czyli ...
... to moja spekulacja ...
... zmieniane wewnątrz funkcji Distribute
(drzewo DOM jest zmieniane wewnątrz tej funkcji i zachodzi klonowanie niektórych węzłów). For-each
struktura pętli też nie pomaga.
Zmienne slajdy działają naprawdę nieokreślonistycznie, przez każdą iterację gwałtownie zmienia swoją długość i kolejność elementów.
Jaki jest właściwy sposób iteracji przez NodeList w moim przypadku? Myślałem o wypełnieniu tymczasowej tablicy, ale nie jestem pewien, jak to zrobić ...
EDYTOWAĆ:
Ważnym faktem, o którym zapomniałem wspomnieć, jest to, że jeden slajd może znajdować się wewnątrz drugiego, tak naprawdę zmienia slides
zmienną, o czym właśnie dowiedziałem się dzięki użytkownikowi Alohci .
Rozwiązaniem dla mnie było najpierw sklonowanie każdego elementu do tablicy, a następnie przekazanie tablicy on-by-one Distribute()
.
źródło
Distribute()
funkcją jest długie i skomplikowane, aby być kopiowane tutaj, ale jestem pewien, że jestem zmieniając wnętrze struktury DOM, ja też powielanie (klonowanie) elementy tam. Kiedy go debuguję, widzę, jak zmiennaslides
zmienia się za każdym razem, gdy jest przekazywana do środka.getElementsByClassName()
zwraca to na żywonodeList
, więc elementy z tą klasą są dodawane do długości zmian,nodeList
po których iterujesz.Odpowiedzi:
Według MDN sposób na pobranie przedmiotu z pliku
NodeList
jest:A zatem:
Sam tego nie próbowałem (normalna
for
pętla zawsze działała), ale daj jej szansę.źródło
for(var el in document.getElementsByClassName("foo")){}
?for ... of
pozwala na iterację po NodeList teraz, jak wfor (slide of slides) Distribute(slide)
. Obsługa przeglądarki jest niejednolita, ale jeśli transpilujesz,for ... of
zostanie przekonwertowana, aleNodeList.forEach
nie.Jeśli używasz nowego querySelectorAll, możesz bezpośrednio wywołać forEach.
Zgodnie z komentarzem poniżej. nodeLists nie mają funkcji forEach.
Jeśli używasz tego z babel, możesz dodać
Array.from
i przekonwertować listy bez węzłów na tablicę forEach.Array.from
nie działa natywnie w przeglądarkach poniżej, w tym w IE 11.Na naszym zeszłym spotkaniu odkryłem inny sposób obsługi list węzłów, które nie mają funkcji forEach
Obsługa przeglądarek dla [...]
Wyświetlane jako lista węzłów
Wyświetlane jako tablica
źródło
if ( !NodeList.prototype.forEach ) {NodeList.prototype.forEach = Array.prototype.forEach;}
[...document.getElementsByClassName('.edit')].forEach(function(button) {
[...document.getElementsByClassName('edit')].forEach(function(button) {
Zawsze możesz użyć metod tablicowych:
źródło
Postępowałem zgodnie z zaleceniem Alohciego , by robić pętlę w odwrotnej kolejności, ponieważ to koncert
nodeList
. Oto, co zrobiłem dla tych, którzy są ciekawi ...źródło
źródło
Miałem podobny problem z iteracją i wylądowałem tutaj. Może ktoś inny również popełnia ten sam błąd, co ja.
W moim przypadku selektor wcale nie był problemem. Problem polegał na tym, że zepsułem kod javascript: miałem pętlę i subloop. Podpętla była również używana
i
jako licznik zamiastj
, więc ponieważ pętla podrzędna przesłaniała wartośći
pętli głównej, ta nigdy nie przeszła do drugiej iteracji.źródło