2010-09-03 28 views
8

đối tượng jQuery của tôi trông như thế này:jQuery.find() bỏ qua rễ nút

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

myJq.find(".a") trả về một đối tượng jQuery trống, rõ ràng là vì find() tìm kiếm chỉ trẻ em các nút chứa trong một đối tượng jQuery, không phải là các nút.

Làm cách nào để lấy một trong các div trong myJq bằng bộ chọn?

Trả lời

14

Thay vào đó, bạn cần sử dụng .filter().

Điều này sẽ lọc qua các mục ở cấp cao nhất của đối tượng jQuery.

myJq.filter(".a") 
+0

Tuyệt vời. Cảm ơn! – morgancodes

+0

@morgancodes - Bạn được chào đón. : o) – user113716

1

Bạn có thể sử dụng .filter()

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

hoặc (tốt hơn, nhanh hơn) sử dụng .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() nhanh hơn khoảng 8x.

+0

Đúng. Nắm bắt theo chỉ số sẽ nhanh hơn so với bộ chọn, nhưng bảo trì dễ vỡ hơn/cao hơn nếu cấu trúc thay đổi. +1 – user113716

+3

'.first()' không hoạt động như bạn nghĩ. Hãy thử làm 'myJq.first ('. B')' để xem ý tôi là gì. '.first()' chỉ đơn giản là phương thức đường cho '.eq (0)' –

+0

Nói cách khác, đối số bạn vượt qua bị bỏ qua. –

6

Dưới đây là một .find2() rằng sẽ tìm thấy tất cả các yếu tố gốc và trẻ em:

$.fn.find2 = function(selector) { 
    return this.filter(selector).add(this.find(selector)); 
}; 

Với điều này, bạn có thể làm:

var html = '<div class="one"><div class="one"></div></div>'; 
var el = html.find2(".one"); // will match both divs 

Dưới đây là thêm về nó: http://danielnouri.org/notes/2011/03/14/a-jquery-find-that-also-finds-the-root-element/