Lorsque je veux obtenir, par exemple, le parent de 3e niveau de l'élément que je dois écrire. $('#element').parent().parent().parent()
Existe-t-il une méthode plus optimale pour cela?
javascript
jquery
parent
Artur Keyan
la source
la source
Réponses:
Puisque parents () retourne les éléments ancêtres classés des plus proches des éléments externes, vous pouvez les enchaîner dans eq () :
la source
$('.element').first().parents().eq(num);
[2]
retournera l'élément DOM sous-jacent, usingeq(2)
retournera un objet jQuery.Dépend de vos besoins, si vous savez quel parent vous recherchez, vous pouvez utiliser le sélecteur .parents ().
EG: http://jsfiddle.net/HenryGarle/Kyp5g/2/
Exemple utilisant l'index:
la source
Vous pouvez donner au parent cible un identifiant ou une classe (par exemple myParent) et la référence est avec
$('#element').parents(".myParent")
la source
Un moyen plus rapide consiste à utiliser javascript directement, par exemple.
Cela fonctionne beaucoup plus rapidement sur mon navigateur que le chaînage des
.parent()
appels jQuery .Voir: http://jsperf.com/jquery-get-3rd-level-parent
la source
Je n'ai trouvé aucune réponse en utilisant
closest()
et je pense que c'est la réponse la plus simple lorsque vous ne savez pas combien de niveaux il y a l'élément requis, alors postez une réponse:vous pouvez utiliser la
closest()
fonction combinée avec des sélecteurs pour obtenir le premier élément qui correspond lors du déplacement vers le haut depuis l'élément:la source
C'est simple. Juste utiliser
où 0 est le niveau du parent (0 est le parent, 1 est le parent du parent, etc.)
la source
Ajoutez simplement un
:eq()
sélecteur comme celui-ci:Vous spécifiez simplement index quel parent: 0 pour le parent immédiat, 1 pour le grand-parent, ...
la source
Si vous prévoyez de réutiliser cette fonctionnalité, la solution optimale est de créer un plugin jQuery:
Bien sûr, vous voudrez peut-être l'étendre pour permettre un sélecteur facultatif et d'autres choses similaires.
Une note: cela utilise un
0
index basé pour les parents, c'est doncnthParent(0)
la même chose que l'appelparent()
. Si vous préférez une1
indexation basée, utilisezn-- > 0
la source
var p = 1 + n; while (p--) { $p = $p.parent(); }
et si vous voulez passer à 1 basé, Javascript étant "faux", vous pouvez utiliser:while (n--) { $p = $p.parent();}
enregistrer une vérification conditionnellenthParent(-2)
? Votre exemple est cassé.(function($) { $.fn.nthParent = function(n) { return $(this).parents().eq(n); }; }(jQuery));
parents
qui sera incorrect pour les sélections avec plus d'un élément.var p = n >? (1 + n):1;
place renverrait le premier parent dans ce cas plutôt que "rien" - ou là où il rompt la boucle dans mon exemple. SO, cela devrait probablement être:(function($) { $.fn.nthParent = function(n) { var $p = $(this); if (!(n > -0)) { return $() }; var p = 1 + n; while (p--) { $p = $p.parent(); } return $p; }; }(jQuery));
si vous ne voulez rien retourner.Si vous avez un parent div commun, vous pouvez utiliser le lien parentsUntil ()
par exemple:
$('#element').parentsUntil('.commonClass')
L'avantage est que vous n'avez pas besoin de vous souvenir du nombre de générations entre cet élément et le parent commun (défini par commonclass).
la source
vous pouvez aussi utiliser :
ex:
$(this).ancestors().eq(2)
-> le parent du parent dethis
.la source
Vous pouvez utiliser quelque chose comme ceci:
http://jsfiddle.net/Xeon06/AsNUu/
la source
l'utilisation de l'eq semble saisir le DOM dynamique tandis que l'utilisation de .parent (). parent () semble saisir le DOM initialement chargé (si cela est même possible).
Je les utilise tous les deux sur un élément auquel des classes sont appliquées sur onmouseover. eq montre les classes alors que .parent (). parent () ne le fait pas.
la source
Lorsque parents () renvoie une liste, cela fonctionne également
la source