2010-01-25 16 views
9

To jest bardziej pytanie o ciekawość. Kiedy w następujący sposób:Wydajność jQuery przy wybieraniu wielu pozycji

$('.selector1, .selector2').doSomething() 

Czy jQuery pełni przemierzać DOM dwa razy, aby dostać każdy zestaw obiektów pasujących do każdego przełącznika lub jest znalezienie wszystkich elementów w jednym traversal DOM?

+0

Nie sądzę, ponieważ z tego, co widziałem w rdzeniu, dopasowania są wykonywane z regex na różnych właściwościach węzła (nodeName, NodeType, id, itd.) Tak więc każdy pojedynczy selektor wytwarza jedną iterację DOM. Jednak nie jestem w 100% pozytywny, więc odradzam innym bardziej znajome z wewnętrznymi :-) – prodigitalson

+0

faktycznie przykład jest zły, ponieważ '' węzeł nie istnieje w HTML :) –

+0

Myślę, że to, co chcesz zrobić, to odszukaj silnik selektora, Sizzle, którego kod źródłowy można obejrzeć: http://github.com/jeresig/sizzle/ http://github.com/jeresig/sizzle/blob/master/sizzle.js – artlung

Odpowiedz

1

myślę, że korzysta z natywnych funkcji przeglądarki, aby znaleźć to, używając:

document.getElementsByClassName() 
1

To naprawdę zależy od przeglądarki. W nowszych przeglądarkach będzie używać document.querySelectorAll dla zapytań DOM (pod maską to wywołuje document.getElementsByClassName dla klas). W starszych przeglądarkach, które tego nie obsługują, musi to samo rozwiązać, co oczywiście będzie wolniejsze.

Ogólnie rzecz biorąc, powinieneś najpierw wolą znaleźć rzeczy według ID (lub przynajmniej zawęzić zakres). Nazwy klas i znaczników będą następnymi szybkościami. Zasadniczo natywnie obsługiwane operacje DOM są najlepsze.

+0

Wygląda na to, że w większości przypadków będzie on przecinał DOM za każdym razem dla każdego selektora. Choć sposób przejścia przez DOM będzie się różnić w zależności od typu selektora (element vs. ID vs. klasa)? –

+0

Tak, użyje wyrażeń regularnych do podzielenia wszystkich zapytań i wykonania ich pojedynczo. Nie martwiłbym się jednak o wydajność klas lub identyfikatorów. –

Powiązane problemy