jQuery parent d'un parent

93

J'essaye actuellement de trouver le parent d'un parent d'un élément. J'ai cliqué sur un lien qui se trouve dans un <td>, et j'aimerais obtenir l' <tr>objet.

Pourquoi "$ (this) .parent (). Parent ()" ne fonctionnera-t-il pas? Ce qui sera?

Merci,
Brendan

Edit: Il semble qu'une erreur dans ma syntaxe a tout gâché. "$ (this) .parent (). parent ()" fonctionne en fait, mais j'ai fini par utiliser $ (this) .closest ('tr') "parce que cela semble être la solution la plus efficace.

lait de bloud
la source
1
pourriez-vous publier le code afin que nous puissions voir pourquoi votre sélecteur parent ne fonctionne pas?
TStamper

Réponses:

221

La meilleure façon serait probablement d'utiliser closest:

$(this).closest('tr');

Consultez la documentation :

Closest fonctionne en regardant d'abord l'élément actuel pour voir s'il correspond à l'expression spécifiée, si c'est le cas, il renvoie simplement l'élément lui-même. S'il ne correspond pas, il continuera à parcourir le document, parent par parent, jusqu'à ce qu'un élément correspondant à l'expression spécifiée soit trouvé. Si aucun élément correspondant n'est trouvé, aucun ne sera renvoyé.

Paolo Bergantino
la source
20

Cela devrait marcher. Vous pouvez également essayer $ (this) .parents (tag), où tag est le tag que vous souhaitez trouver.

Par exemple:

$(this).parents("tr:first")

Trouvera le tr le plus proche "en haut de la chaîne".

Philippe Leybaert
la source
9

Cela devrait fonctionner ... vous pourriez essayer

$(this).parents(':eq(1)');

Le .parents (sélecteur) dit obtenir tous les ancêtres qui correspondent au sélecteur

et le: eq (1) dit trouver le oneth (indexé à zéro, donc le deuxième) élément dans la liste

Lathan
la source
Vous pouvez essayer d'alerter ceci, pour vous assurer qu'il s'agit d'une balise d'ancrage HTML. Essayez de faire: alert ('anchor html (' + $ (this) .html () + ')');
Lathan
6

Cet extrait a joué pour moi dans le passé:

$(this).parent().parent(); 

Postez un code pour nous pour voir s'il pourrait y avoir un autre problème quelque part ...

Gabriel Hurley
la source
Je suis d'accord avec ça. Je peux utiliser $(this).parent().parent()sans problème
DrewT
5

Essayez aussi

$(this).closest('div.classname').hide();
Dilip
la source
2

Si vous avez une sorte d'identifiant / classe pour le parent, vous pouvez utiliser parents () mais cela vous donnera tous les parents jusqu'au <corps> à moins que vous ne filtriez () ou que vous l'arrêtiez d'une autre manière comme

$(this).parents('.myClass');

J'espère que cela aide quelqu'un :)

abhilashv
la source
1

Essayez d'encapsuler $ (this) .parent () dans un objet jQuery comme $ ($ (this) .parent ()) Je trouve souvent le besoin de le faire pour m'assurer que j'ai un objet jquery valide. De là, vous devriez être en mesure de mettre la main sur le parent des parents, ou en utilisant peut-être le prev ().

kristian nissen
la source
8
C'est complètement inutile. Tout ce que vous faites est de perdre du temps en créant un autre objet jQuery ...
James
1
var getParentNode = function(elem, level) { 
    level = level || 1; 
    for (var i = 0; i < level; i++) {
        if (elem != null) {
            elem = elem.parentNode; 
        }
    }
    return elem; 
}
Alex Polo
la source
0

.closest() n'est pas toujours la meilleure option, spécialement lorsque vous avez la même construction d'élément.

<div>
    <div>
        <div>
        </div>
    </div>
</div>

Vous pouvez faire parent d'un parent et c'est très simple:

var parent = $('.myDiv').parent();
var parentParent = $(parent).parent();
var parentParentParent = $(parentParent).parent();

etc.

Webapper
la source