2010-03-24 21 views
32

Người ta có thể sử dụng matchedset.find(selector)/matchedset.parents(selector) để nhận con cháu/tổ tiên của tập hợp phù hợp hiện tại được lọc bởi bộ chọn, nhưng không bao gồm tập hợp kết hợp (nếu nó xảy ra phù hợp với bộ chọn quá). Có cách nào tốt hơn (súc tích và/hoặc nhanh hơn) để nhận được hơnJquery: lấy tổ tiên (hoặc con cháu) và tự

matchedset.find(selector).add(matchedset.filter(selector)) 

và tương ứng cho cha mẹ()?

Trả lời

42

Bạn có thể làm điều này:

matchedset.find('*').andSelf().filter(selector); 

Đối với cha mẹ:

matchedset.parents('*').andSelf().filter(selector); 
+0

Đó là tốt hơn? '.find ('*')' hoặc '.contents()' như trong: http://stackoverflow.com/questions/364791/jquery-select-descendants-including-the-parent – Joe

+10

Có thể là một ý tưởng hay để lưu ý rằng andSelf hiện không được chấp nhận và đã được thay thế bằng addBack() cũng chấp nhận công cụ chọn. http://api.jquery.com/addBack/ –

0

Tra cứu hàm "andSelf()".

+2

andSelf() không phải mất một selector – gsakkis

17

Tôi nghĩ rằng phương pháp của bạn là hiệu quả về thời gian thực hiện, nhưng những gì có thể là bạn đang yêu cầu là đường cú pháp. Cho rằng, bạn có thể quấn nó thành một plugin:

jQuery.fn.findAndSelf = function(selector) { 
    return this.find(selector).add(this.filter(selector)) 
    } 

Sau đó sử dụng nó như thế này:

$('.whatever').findAndSelf('.awesome') 

Nếu bạn muốn nhận được ưa thích bạn có thể tạo một plugin mà làm việc không chỉ cho 'tìm' nhưng đối với phụ huynh 'và 'trẻ em' và plugin chọn khác dựa trên:

jQuery.fn.withSelf = function(plugin, selector) { 
    return this[plugin](selector).add(this.filter(selector)) 
    } 

Sau đó, bạn muốn cung cấp như là đối số đầu tiên traversal cắm bạn muốn gọi:

$('.whatever').withSelf('find', '.awesome') 
$('.whatever').withSelf('parents', '.awesome') 

Chỉ cần cho đá, một plugin thú vị mà cho phép bạn gọi một số tùy ý các plugin traversal tất cả cùng một lúc:

jQuery.fn.traverse = function(plugins, selector) { 
    var set = new jQuery(); 
    $.each(plugins, function(i, val) { 
     set.add(this[val](selector)); 
    } 
    return set 
    } 

Bạn có thể gọi một này với bất kỳ sự kết hợp của các plugin chọn dựa trên, như sau :

$('.whatever').traverse(['find','filter'], '.awesome') 
$('.whatever').traverse(['parents','find'], '.awesome') 
$('.whatever').traverse(['parents', 'filter'], '.awesome') 
2

Trong khi giải pháp của Jeoff đẹp, đôi khi thật tuyệt khi có thể lặp lại tất cả các yếu tố, kể cả chính nó mà không có bộ chọn. add-on này là linh hoạt hơn một chút:

$.fn.all = function(selector) { 
    if(selector===window.undefined) return this.find('*').andSelf(); 
    return this.filter(selector).add(this.find(selector)); 
}; 
0

Đối với cha mẹ bạn có closest(selector)

Các vấn đề liên quan