2010-09-03 14 views
8

Mój obiekt jQuery wygląda następująco:jQuery.find() ignoruje węzeł główny

var myJq = jQuery("<div class='a'></div><div class='b'></div>") 

myJq.find(".a") zwraca pusty obiekt jQuery, najwyraźniej dlatego tylko find() przeszukuje dzieci węzłów znajdujących się w obiekcie jQuery, nie same węzły.

Jak mogę pobrać jeden z elementów div w myJq za pomocą selektora?

Odpowiedz

14

Zamiast tego należy użyć .filter().

Spowoduje to filtrowanie elementów znajdujących się na najwyższym poziomie obiektu jQuery.

myJq.filter(".a") 
+0

Awesome. Dzięki! – morgancodes

+0

@morgancodes - Nie ma za co. : o) – user113716

1

Można użyć .filter()

var div = myJq.filter('.a'); 

lub (lepiej, szybciej) używać .first()

var div = myJq.first('.a'); 

Benchmark

var myJq = jQuery("<div class='a'></div><div class='b'></div>") 
var loop = 20000; 

console.time('filter'); 
while(loop--){ 
    var blah = myJq.filter(".a"); 
} 
console.timeEnd('filter'); 

loop = 20000; 

console.time('first'); 
while(loop--){ 
    var blah = myJq.first(".a"); 
} 
console.timeEnd('first'); 

.first() jest dla mnie około 8 razy szybszy.

+0

Prawda. Pobieranie według indeksu byłoby szybsze niż w przypadku selektora, ale bardziej kruche/wyższe utrzymanie, jeśli struktura ulegnie zmianie. +1 – user113716

+3

'.first()' nie działa tak, jak myślisz. Spróbuj zrobić 'myJq.first ('. B')', aby zobaczyć co mam na myśli. '.first()' jest po prostu metodą dla '.eq (0)' –

+0

Innymi słowy, argument, który przekazujesz, jest ignorowany. –

Powiązane problemy