2010-03-24 13 views
32

On peut utiliser matchedset.find(selector)/matchedset.parents(selector) pour obtenir les descendants/ancêtres de l'ensemble actuel filtré par un sélecteur, mais qui n'inclut pas l'ensemble correspondant lui-même (si cela arrive à correspondre au sélecteur aussi). Y at-il une meilleure (plus concise et/ou plus rapide) façon de l'obtenir queJquery: obtenir des ancêtres (ou des descendants) et soi

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

et pour les parents respectifs()?

Répondre

42

Vous pouvez le faire:

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

Pour les parents:

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

Quel est le meilleur? '.find ('*')' ou '.contents()' comme dans: http://stackoverflow.com/questions/364791/jquery-select-descendants-including-the-parent – Joe

+10

Probablement une bonne idée de noter que andSelf est maintenant déprécié et a été remplacé par addBack() qui accepte également un sélecteur. http://api.jquery.com/addBack/ –

0

Recherchez la fonction "andSelf()".

+2

andSelf() ne prend pas un sélecteur – gsakkis

17

Je pense que votre méthode est efficace en termes de temps d'exécution, mais ce que vous vous demandez probablement est le sucre syntaxique. Pour cela, vous pouvez l'envelopper dans un plugin:

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

utiliser ensuite comme ceci:

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

Si vous voulez obtenir la fantaisie, vous pouvez créer un plugin qui fonctionne non seulement pour « trouver » mais pour « parents » et « enfants » et d'autres plug-ins à base sélecteur-:

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

alors vous l'offre comme le premier argument du plug-in traversal que vous voulez appeler:

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

Juste pour voir, un autre plugin amusant qui vous permet d'appeler un nombre arbitraire de plugins traversal à la fois:

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

Vous pouvez appeler celui-ci avec une combinaison de plug-ins à base de sélection, comme suit :

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

Alors que la solution de Jeoff est agréable, il est parfois agréable de pouvoir itérer tous les éléments, y compris lui-même sans un sélecteur. Cette add-on est un peu plus souple:

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

Pour les parents vous ont closest(selector)