2012-07-28 17 views
21

Miałem nadzieję, że $('#childDiv2 .txtClass') lub $('#childDiv2 input.txtClass') będzie działać lepiej po wybraniu elementu <input type="text" id="txtID" class="txtClass"/>. Ale według tego performance analysis$('.txtClass'); jest najlepszym selektorem spośród tego. Używam JQuery 1.7.2 Czy ktoś ma wyjaśnienie tego?Element jquery + wydajność selektora klasy

Performance analysis for class selectors

HTML

<div class="childDiv2"> 
    <input type="text" id="txtID" class="txtClass"/> 
    <p class="child">Blah Blah Blah</p> 
</div>​ 

JS

$('.txtClass'); 
$('#childDiv2 .txtClass') 
$('#childDiv2 > .txtClass') 
$('input.txtClass') 
$('#childDiv2 input.txtClass') 
+0

Ponieważ id musi być unikalny, najszybszym sposobem będzie '$ (" # txtID ")' – Andreas

+0

Moją obawą jest wybór według scenariuszy zajęć? – Lanka

+0

Świetne pytanie. Nie mam odpowiedzi, ale to ciekawe, że nawet podanie kontekstu $ (".txtClass", "# childDiv2") jest wciąż wolniejsze niż selektor klasy. –

Odpowiedz

36

Nowoczesne przeglądarki narazić bardzo wydajne getElementsByClassName() metodę, która zwraca elementy mające daną klasę. Dlatego wybór jednej klasy jest szybszy w twoim przypadku.

Wypracowanie na swoich przykładach:

$(".txtClass")     => getElementsByClassName() 

$("#childDiv2 .txtClass")  => getElementById(), 
            then getElementsByClassName() 

$("#childDiv2 > .txtClass")  => getElementById(), 
            then iterate over children and check class 

$("input.txtClass")    => getElementsByTagName(), 
            then iterate over results and check class 

$("#childDiv2 input.txtClass") => getElementById(), 
            then getElementsByTagName(), 
            then iterate over results and check class 

Jak widać, jest to dość logiczne pierwsza forma się najszybszy na nowoczesnych przeglądarek.

+0

Więc mogę powiedzieć, że prawie każdy tutoriali wydajności jquery znaleźć w Internecie są nieprawidłowe. Nawet tutoriale niektórych facetów jquery takich jak [Addy Osmani] (http://addyosmani.com/jqprovenperformance/) – Lanka

+3

@Lanka, może nie * niepoprawne *, tylko * nieaktualne *. Technologia marsze na, i najlepsza porada występ dzisiaj może bardzo dobrze może być źle w przyszłym roku. Z drugiej strony testy porównawcze podadzą aktualne numery. –

+0

Tak, to prawda. Właściwie myliłem się w moim poprzednim komentarzu. Ten facet wyjaśnił to na slajdach. – Lanka

5

Selektory CSS są analizowane od prawej do lewej. Tak więc Twój przykład: wykonanie dwóch czynności wymaga wykonania dwóch czynności. Najpierw znajdź wszystkie elementy z klasą txtClass. Następnie sprawdź każdy element pod kątem bycia dzieckiem elementu o identyfikatorze childDiv2.

$('.txtClass') 

Ten selektor wykona jedną czynność. Znajdź wszystkie elementy z klasą txtClass

Wystarczy popatrzeć na this article na css-tricks.com

+0

Jak wiem skwiercz, zoptymalizuj to zapytanie. Więc to działa inaczej niż twoje wyjaśnienie. Najpierw wybierz childDiv2, a następnie wyszukaj txtClass w jego elementach potomnych. – Lanka

+0

w rzeczywistości pierwsza pokazana linia kodu wymaga sprawdzenia każdego elementu .txtClass, aby sprawdzić, czy jest to DESCENDANT # childDiv2. To wymaga zbadania WSZYSTKICH przodków poszczególnych .txtClass. – ToolmakerSteve

1

Wygląda na to również zależy od gęstości elementów z klasą wśród elementów typu.

Uruchomiłem testy z Google Chrome w wersji 30.0.1599.69 za pomocą JQuery 1.10.1. Możesz go wypróbować w innej przeglądarce i/lub przy użyciu innej wersji JQuery.

Próbowałem uruchomić następujące testy:

  1. Sparse (10% div mają klasę) link to the test on jsbin

  2. Gęsty (90% div mają klasę) link to the test on jsbin

Wygląda na Gęsty przypadkówdiv.class zwycięstw, ale w Rzadki przypadek.class wygrywa.

+0

Podobnie jak w komentarzach, które wspominają gęste/rzadkie, często jest to pomijane. Nie ma srebrnej kuli oprócz używania identyfikatora, jeśli możesz. –

Powiązane problemy