O ile wiem, w jQuery można wybierać elementy potomne na wiele sposobów .
//Store parent in a variable
var $parent = $("#parent");
Metoda 1 (przy użyciu zakresu)
$(".child", $parent).show();
Metoda 2 ( metoda find ())
$parent.find(".child").show();
Metoda 3 (tylko dla bezpośrednich dzieci)
$parent.children(".child").show();
Metoda 4 (przez selektor CSS) - sugerowana przez @spinon
$("#parent > .child").show();
Metoda 5 (identyczna z metodą 2 ) - zgodnie z @Kai
$("#parent .child").show();
Nie jestem zaznajomiony z profilowaniem, aby móc to zbadać samodzielnie, więc chciałbym zobaczyć, co masz do powiedzenia.
PS Rozumiem, że to możliwe powtórzenie tego pytania, ale nie obejmuje wszystkich metod.
Odpowiedzi:
Metoda 1 i metoda 2 są identyczne, z tą różnicą, że metoda 1 musi przeanalizować przekazany zakres i przetłumaczyć go na wywołanie
$parent.find(".child").show();
.Metody 4 i 5 muszą przeanalizować selektor, a następnie po prostu wywołać odpowiednio :
$('#parent').children().filter('.child')
i$('#parent').filter('.child')
.Zatem metoda 3 zawsze będzie najszybsza, ponieważ wymaga wykonania najmniejszej ilości pracy i wykorzystuje najbardziej bezpośrednią metodę, aby zdobyć dzieci pierwszego stopnia.
Na podstawie poprawionych testów prędkości Anurag tutaj: http://jsfiddle.net/QLV9y/1/
Test prędkości: (im więcej, tym lepiej)
W przeglądarce Chrome metoda 3 jest najlepsza, a następnie metoda 1/2, a następnie 4/5
W przeglądarce Firefox metoda 3 jest nadal najlepsza, a następnie metoda 1/2, a następnie 4/5
W przeglądarce Opera metoda 3 jest nadal najlepsza, a następnie metoda 4/5, a następnie 1/2
W IE 8 , chociaż ogólnie wolniejszy niż w innych przeglądarkach, nadal jest zgodny z kolejnością metody 3, 1,2,4,5.
Ogólnie rzecz biorąc, metoda 3 jest ogólnie najlepszą metodą do użycia, ponieważ jest wywoływana bezpośrednio i nie musi przechodzić przez więcej niż jeden poziom elementów podrzędnych w przeciwieństwie do metody 1/2 i nie musi być analizowana jak metoda 4/5
Należy jednak pamiętać, że w niektórych z nich porównujemy jabłka do pomarańczy, ponieważ Metoda 5 dotyczy wszystkich dzieci, a nie dzieci pierwszego poziomu.
źródło
$parent.find(".child");
polecenie.Metoda 1
Nie można być krótszym i szybszym przy użyciu jQuery. To wywołanie sprowadza się bezpośrednio do
$(context).find(selector)
( metoda 2 , ze względu na optymalizację), która z kolei wywołujegetElementById
.Metoda 2
Robi to samo, ale bez niepotrzebnych wywołań funkcji wewnętrznych.
Metoda 3
używanie
children()
jest szybsze niż używaniefind()
, ale oczywiściechildren()
znajdzie tylko bezpośrednie elementy potomne elementu głównego, podczas gdyfind()
będzie wyszukiwać rekursywnie z góry na dół do wszystkich elementów potomnych (w tym elementów podrzędnych)Metoda 4
Korzystanie z takich selektorów musi być wolniejsze. Ponieważ
sizzle
(który jest silnikiem selektora z jQuery) działa od prawej do lewej , najpierw dopasuje WSZYSTKIE klasy,.child
zanim sprawdzi, czy są one bezpośrednim dzieckiem z id 'rodzic'.Metoda 5
Jak poprawnie stwierdziłeś, wywołanie to również utworzy
$(context).find(selector)
wywołanie, z powodu pewnej optymalizacji wjQuery
funkcji, w przeciwnym razie może również przejść przez (wolniej)sizzle engine
.źródło
Internally, selector context is implemented with the .find() method
-proszę o aktualizację, wiem, że#parent
reprezentuje id, jeśli jest to klasa, togetElementById
oczywiście nie będzie używane .Ponieważ jest to stary post, a wraz z upływem czasu wszystko się zmienia. Zrobiłem kilka testów na ostatnich wersjach przeglądarek do tej pory i zamieszczam je tutaj, aby uniknąć nieporozumień.
Korzystanie z jQuery 2.1 w przeglądarkach zgodnych z HTML5 i CSS3 zmienia wydajność.
Oto scenariusz testu i wyniki:
Tak więc za 100 000 iteracji otrzymuję:
(Dodałem je jako img do celów formatowania).
Możesz samodzielnie uruchomić fragment kodu, aby przetestować;)
źródło
.find()
wykonuje świetną robotę. Nadal z niego korzystać. :)