34 votes

Jquery: obtenir des ancêtres (ou des descendants) et soi

On peut utiliser matchedset.find(selector) - matchedset.parents(selector) pour obtenir les descendants / ancêtres de l’ensemble mis en correspondance actuel filtré par un sélecteur, mais cela n'inclut pas l’ensemble mis en correspondance lui-même (s’il se trouve le sélecteur aussi). Y at-il un meilleur moyen (plus concis et / ou plus rapide) de l'obtenir que

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

et le respect pour les parents ()?

44voto

Nick Craver Points 313913

Tu peux le faire:

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

Pour les parents:

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

17voto

Jeoff Wilks Points 328

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

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

Ensuite l'utiliser comme ceci:

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

Si vous vouliez obtenir la fantaisie, vous pourriez créer un plugin qui fonctionne non seulement pour "trouver", mais pour "parents" et "enfants" et d'autres sélecteur à base de plugins:

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

Puis vous auriez approvisionnement comme premier argument de la traversée de plugin que vous voulez l'appeler:

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

Juste pour le plaisir, plaisir un autre plugin qui vous permet d'appeler un nombre arbitraire de la traversée de plugins tout à 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 pourriez appeler cela un avec n'importe quelle combinaison de sélecteur à base de plugins, comme suit:

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

2voto

Mark Points 49079

Bien que la solution de Jeoff soit intéressante, il est parfois agréable de pouvoir parcourir tous les éléments, y compris lui-même, sans sélecteur. Cet add-on est un peu plus flexible:

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

0voto

Pointy Points 172438

Recherchez la fonction "andSelf ()".

0voto

m0she Points 163

Pour les parents, vous avez closest(selector)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X