2010-03-24 4 views
32

Man kann matchedset.find(selector)/matchedset.parents(selector) verwenden, um die Nachkommen/Vorfahren des aktuellen übereinstimmenden Set durch einen Selektor gefiltert zu bekommen, aber das Matched Set selbst nicht enthält (wenn es passiert passen Sie den Selektor auch an). Gibt es einen besseren (prägnanten und/oder schneller) Weg, um es zu bekommen, alsJquery: get Vorfahren (oder Nachkommen) und Selbst

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

und die jeweilige für die Eltern()?

Antwort

42

Sie können dies tun:

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

Für die Eltern:

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

Was ist besser? '.find ('*')' oder '.contents()' wie in: http://stackoverflow.com/questions/364791/jquery-select-descendants-das-parent – Joe

+10

Wahrscheinlich eine gute Idee, das zu beachten andSelf ist jetzt veraltet und wurde durch addBack() ersetzt, das auch einen Selektor akzeptiert. http://api.jquery.com/addBack/ –

0

Suchen Sie die Funktion "andSelf()".

+2

andSelf haben() muss kein Wähler – gsakkis

17

Ich denke, Ihre Methode in Bezug auf die Ausführungszeit effizient ist, aber was sind Sie wahrscheinlich ist zu fragen syntaktischer Zucker. Dafür könnte man es in ein Plugin wickeln:

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

es dann wie folgt verwenden:

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

Wenn Sie Lust bekommen wollten Sie ein Plugin erstellen können, die nicht nur für ‚finden‘ funktioniert aber für ‚Eltern‘ und ‚Kinder‘ und anderer Selektor-basierte Plug-in:

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

Dann sind Sie als erstes Argument liefern würden die Traversal-Plugin Ihnen anrufen mögen:

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

Just for Kicks, eine andere Spaß-Plugin, das Sie auf einmal eine beliebige Anzahl von Traversal-Plugins können anrufen:

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

Sie diese mit einer beliebigen Kombination von Selektor-basierte Plugins aufrufen könnte, wie folgt :

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

Während Jeoff Lösung ist schön, manchmal ist es schön, alle Elemente zu durchlaufen zu können, einschließlich sich selbst, ohne einen Selektor. Dieses Add-on ist ein bisschen flexibler:

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

Für die Eltern Sie closest(selector)

Verwandte Themen