Question

On peut utiliser matchedset.find(selector) / matchedset.parents(selector) pour obtenir les descendants / ancêtres de l'ensemble apparié courant filtré par un sélecteur, mais qui ne comprend pas lui-même appariées (si elle arrive à correspondre au sélecteur trop). Y at-il une meilleure (plus concise et / ou plus rapide) façon de l'obtenir que

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

et les respectifs pour les parents ()?

Était-ce utile?

La solution

Vous pouvez faire ceci:

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

Pour les parents:

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

Autres conseils

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 plug-in:

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

Utilisez 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 « les 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))
  }

Ensuite, vous auriez fournissiez comme premier argument le plugin 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')

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));
};

Recherchez le "andSelf ()" fonction.

Pour les parents, vous avez closest(selector)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top