Aby wybrać węzeł potomny w jQuery, można użyć dzieci (), ale także find ().
Na przykład:
$(this).children('.foo');
daje taki sam wynik jak:
$(this).find('.foo');
Która opcja jest najszybsza lub preferowana i dlaczego?
jquery
jquery-selectors
bart
źródło
źródło
.find()
i.children()
nie są takie same. Ten ostatni przesuwa się tylko o jeden poziom w dół drzewa DOM, podobnie jak selektor potomny.find()
prawie zawsze jest to szybsze.Odpowiedzi:
children()
patrzy tylko na bezpośrednie elementy potomne węzła, podczas gdyfind()
przemierza cały DOM poniżej węzła, więcchildren()
powinno być szybciej, biorąc pod uwagę równoważne implementacje. Jednakżefind()
wykorzystuje natywne metody przeglądarki, natomiastchildren()
zastosowania JavaScript interpretować w przeglądarce. W moich eksperymentach nie ma dużej różnicy wydajności w typowych przypadkach.Które użyć zależy od tego, czy chcesz wziąć pod uwagę tylko bezpośrednich potomków, czy wszystkie węzły poniżej tego w DOM, tj. Wybierz odpowiednią metodę w oparciu o pożądane wyniki, a nie szybkość metody. Jeśli wydajność naprawdę stanowi problem, eksperymentuj, aby znaleźć najlepsze rozwiązanie i skorzystaj z niego (lub zobacz niektóre testy porównawcze w innych odpowiedziach tutaj).
źródło
Ten test jsPerf sugeruje, że find () jest szybszy. Stworzyłem dokładniejszy test i nadal wygląda na to, że find () przewyższa dzieci ().
Aktualizacja: Zgodnie z komentarzem tvanfosson stworzyłem kolejny przypadek testowy z 16 poziomami zagnieżdżenia. find () działa wolniej tylko przy wyszukiwaniu wszystkich możliwych div, ale find () wciąż przewyższa child () przy wyborze pierwszego poziomu div.
children () zaczyna osiągać lepsze wyniki niż find (), gdy istnieje ponad 100 poziomów zagnieżdżenia i około 4000+ div do przejścia przez find (). Jest to podstawowy przypadek testowy, ale nadal uważam, że find () jest szybszy niż children () w większości przypadków.
Przeszedłem przez kod jQuery w Narzędziach dla programistów Chrome i zauważyłem, że dzieci () wewnętrznie wywołują sibling (), filter () i przechodzą przez kilka więcej wyrażeń regularnych niż find ().
find () i child () spełniają różne potrzeby, ale w przypadkach, w których find () i children () wygenerowałyby ten sam wynik, zaleciłbym użycie find ().
źródło
Tutaj jest link z testem wydajności, który możesz uruchomić.
find()
jest faktycznie około 2 razy szybszy niżchildren()
.źródło
var $test = $list.find('.test');
gdzie $ list jest obiektem jQuery. jsperf.com/jquery-selectors-context/101Ci, niekoniecznie dają ten sam rezultat:
find()
będzie Ci żadnego potomka węzła, natomiastchildren()
dostanie tylko ty natychmiastowe dzieci pasujących.W pewnym momencie
find()
było znacznie wolniej, ponieważ musiał szukać każdego węzła potomnego, który mógłby być dopasowany, a nie tylko bezpośrednich dzieci. Jednak nie jest to już prawdą;find()
jest znacznie szybszy dzięki zastosowaniu natywnych metod przeglądarki.źródło
find()
było wtedy znacznie wolniejsze!Żaden z pozostałych odpowiedzi rozpatrywane przypadku użycia
.children()
lub.find(">")
do tylko szukać bezpośrednich dzieci elementu nadrzędnego. Dlatego stworzyłem test jsPerf, aby się dowiedzieć , używając trzech różnych sposobów rozróżniania dzieci.Tak się składa, że nawet przy użyciu dodatkowego selektora „>”
.find()
jest nadal dużo szybszy niż.children()
; w moim systemie, 10x tak.Tak więc, z mojej perspektywy, wydaje się, że nie ma żadnego powodu, aby
.children()
w ogóle używać mechanizmu filtrującego .źródło
Ułatwiać:
find()
- przeszukaj dziecko dopasowanych elementów, wnuka, prawnuka ... wszystkie poziomy w dół.children()
- przeszukuj tylko elementy potomne dopasowanych elementów (o jeden poziom niżej).źródło