53 votes

jQuery "hasParent"

Le JQuery "a" méthode efficace permet de sélectionner tous les éléments dans lesquels ils sont particulièrement descendants.

Je veux sélectionner des éléments basés sur le fait qu'ils ont notamment ancêtres. Je sais à propos de parent([sélecteur]) et les parents([sélecteur]), mais ces derniers sélectionnez les parents et non les enfants avec les parents.

Donc, il y a un ancêtre équivalent de "a"?

Note: j'ai déjà le contexte d'un élément plus bas dans la hiérarchie, et je vais être une sélection en fonction de ce que je ne peux pas faire un "top-down" de la requête.

Mise à jour

Je n'ai évidemment expliqué me suis vraiment mal ici, donc je vais essayer de préciser:

<ul class="x">
  <li>1</li>
  <li>2</li>
  <li>3</li>
</ul>
<ul class="y">
  <li>4</li>
  <li>5</li>
  <li>6</li>
</ul>

J'ai un objet jQuery qui déjà se compose des éléments 2,3,4 et 5. Je veux choisir les éléments qui ont un parent avec l'class = x.

L'espoir qui fait plus de sens.

72voto

Jonathan Sampson Points 121800

Pour un nettoyage réutilisables solution, envisager d'étendre l' jQuery.fn objet avec une méthode personnalisée utilisées pour déterminer la présence d'un ancêtre particulier pour tout élément donné:

// Extend jQuery.fn with our new method
jQuery.extend( jQuery.fn, {
    // Name of our method & one argument (the parent selector)
    within: function( pSelector ) {
        // Returns a subset of items using jQuery.filter
        return this.filter(function(){
            // Return truthy/falsey based on presence in parent
            return $(this).closest( pSelector ).length;
        });
    }
});

Il en résulte une nouvelle méthode, $.fn.within, que nous pouvons utiliser pour filtrer nos résultats:

$("li").within(".x").css("background", "red");

Cela sélectionne tous les éléments de la liste sur le document, puis filtres à ceux qui ont .x comme un ancêtre. Parce que c'utilise jQuery en interne, vous pourriez passer plus compliqué sélecteur:

$("li").within(".x, .y").css("background", "red");

Cela permettra de filtrer la collection d'éléments qui descendent de soit .x ou .y, ou les deux.

Violon: http://jsfiddle.net/jonathansampson/6GMN5/

50voto

psychotik Points 11937

if ( $('.foo').parents('.parentSelector').length ) { // has parent }

36voto

David Points 36241

Si je comprends bien votre question, cela ferait:

 $.fn.hasAncestor = function(a) {
    return this.filter(function() {
        return !!$(this).closest(a).length;
    });
};

$('.element').hasAncestor('.container').myAction();

<div class="container">
  <span>
    <strong class="element">strong</strong>
  </span>
</div>
 

1voto

streetparade Points 6097

Essaye ça

 ul.myList > li > a
 

Ce sélecteur sélectionne uniquement les liens qui sont des enfants directs d'éléments de liste, qui sont eux-mêmes des enfants d'éléments ayant la classe myList.

0voto

Powerlord Points 43989

Le moyen le plus simple est le suivant:

 // all children of a specific parent match
$('parentSelector').children();

// All children matching a specific pattern, one level deep
$('parentSelector > childSelector');
// or
// $('parentSelector').children('childSelector');

// All children matching a specific pattern, multiple levels deep
$('parentSelector childSelector');
// or
// $('parentSelector').find('childSelector');
 

ou aviez-vous vraiment besoin de quelque chose de plus compliqué que cela?

Edit: Si vous avez déjà un élément, vous pouvez le combiner avec la commande parent (), comme ceci:

 myElement.parents('parentSelector').find('childSelector'); // Will include self
 

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