2010-03-24 49 views
32

可以使用matchedset.find(selector)/matchedset.parents(selector)獲取當前匹配集的後代/祖先,這些匹配集由選擇器過濾,但不包含匹配集本身(如果它碰巧也匹配選擇器)。有沒有更好的(更簡潔和/或更快)的方式來獲得它比Jquery:獲取祖先(或後代)和自我

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

和各自的父母()?

回答

42

你可以這樣做:

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

對於家長:

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

哪個更好? '.find('*')''或'.contents()'就像:http://stackoverflow.com/questions/364791/jquery-select-descendants-including-the-parent – Joe 2012-09-11 19:55:14

+10

可能是一個好主意,注意到andSelf現在已被棄用,並已被接受選擇器的addBack()所取代。 http://api.jquery.com/addBack/ – 2013-02-14 09:07:07

0

查找「andSelf()」函數。

+2

andSelf()不帶選擇 – gsakkis 2010-03-24 15:30:30

17

我覺得你的方法是在執行時間方面是高效的,但你可能會問的是語法糖。對於這一點,你可以把它包裝成一個插件:

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

然後使用它是這樣的:

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

如果你想獲得看上你可以創建一個不僅對「發現」工作的插件但對於「父母」和「孩子」和其他基於選擇器插件:

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

然後,你提供的第一個參數遍歷插件,您要撥打:

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

只是踢,另一個有趣的插件,讓你打電話一下子穿越插件任意數量:

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

你可以調用這個一個基於選擇器插件的任意組合,如下:

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

雖然Jeoff的解決方案是好的,有時真的很高興能夠遍歷所有元素,包括它自己沒有選擇。這種附加是一個比較靈活:

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

對於父母你有closest(selector)