Dziękujemy za poruszenie tego problemu. W wielu przypadkach różnica w wydajności jest banalna, ale dokumenty nie wspominają, że te dwie metody są zaimplementowane inaczej! Ze względu na najlepsze praktyki warto wiedzieć, że find()prawie zawsze jest to szybsze.
children()patrzy tylko na bezpośrednie elementy potomne węzła, podczas gdy find()przemierza cały DOM poniżej węzła, więc children()powinno być szybciej, biorąc pod uwagę równoważne implementacje. Jednakże find()wykorzystuje natywne metody przeglądarki, natomiast children()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).
Wydajność wyszukiwania dzieci i wyszukiwania zależy od przeglądarki i od stopnia skomplikowania poddrzewa DOM. W nowoczesnych przeglądarkach find () wewnętrznie używa querySelectorAll, który z łatwością może przewyższyć child () w złożonym selektorze oraz w małym lub umiarkowanym poddrzewie DOM.
Dla mnie we wszystkich testach z zagnieżdżeniem hierarchii między 5 a 20 find () zawsze przewyższał dzieci (). (testowany w Google Chrome 54) Spodziewałem się czegoś przeciwnego.
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 ().
Dość zdegenerowany test, ponieważ masz tylko jeden poziom zagnieżdżenia. Jeśli chcesz ogólny przypadek, musisz ustawić dowolne głębokości zagnieżdżenia i sprawdzić wydajność, ponieważ find () przemierza głębsze drzewa niż dzieci ().
Jeśli sprawdzasz, czy określony pojedynczy element potomny (np. Event.target) znajduje się w określonym elemencie dom (np. $ ('. Navbar')), wówczas $ .contains (this, event.target) jest zdecydowanie najszybszy (8,433,609 / sekundę vs 140k dla najszybszego wyszukiwania jquery). jsperf.com/child-is-in-parent
$ .contains (document.getElementById („lista”), $ („. test”) [0]) wynosi 8,433,609 / sekundę. Jeśli masz określone elementy i po prostu chcesz wiedzieć, czy B jest w A, to najlepiej. jsperf.com/child-is-in-parent
Niezły test. Zauważ, że może być jeszcze szybciej, jeśli zrobisz coś takiego, var $test = $list.find('.test');gdzie $ list jest obiektem jQuery. jsperf.com/jquery-selectors-context/101
Ci, niekoniecznie dają ten sam rezultat: find()będzie Ci żadnego potomka węzła, natomiast children()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.
Ż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 .
Dziękuję za ten komentarz! Zastanawiam się, czy jQuery powinien po prostu przełączyć się na tworzenie .children (x) jako aliasu dla .find (">" + x), chociaż prawdopodobnie są inne komplikacje, o których nie myślę.
Zarówno find()i children()sposoby są stosowane do filtrowania dziecko dopasowanych elementów, z wyjątkiem pierwszych jest przemieszcza się dowolnym poziomie w dół, to jest on przemieszcza jeden poziom niżej.
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).
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.
.find()i.children()nie są takie same. Ten ostatni przesuwa się tylko o jeden poziom w dół drzewa DOM, podobnie jak selektor potomny.