Lorsque je veux obtenir, par exemple, le parent de troisième niveau de l'élément sur lequel je dois écrire $('#element').parent().parent().parent()
Existe-t-il une méthode plus optimale pour cela?
Puisque parents () renvoie les éléments ancêtres ordonnés du plus proche aux éléments extérieurs, vous pouvez les chaîner dans eq () :
$('#element').parents().eq(0); // "Father".
$('#element').parents().eq(2); // "Great-grandfather".
Dépend de vos besoins, si vous savez quel parent vous recherchez, vous pouvez utiliser le sélecteur .parents ().
E.G: http://jsfiddle.net/HenryGarle/Kyp5g/2/
<div id="One">
<div id="Two">
<div id="Three">
<div id="Four">
</div>
</div>
</div>
</div>
var top = $("#Four").parents("#One");
alert($(top).html());
Exemple utilisant index:
//First parent - 2 levels up from #Four
// I.e Selects div#One
var topTwo = $("#Four").parents().eq(2);
alert($(topTwo ).html());
Un moyen plus rapide consiste à utiliser JavaScript directement, par exemple.
var parent = $(innerdiv.get(0).parentNode.parentNode.parentNode);
Cela s'exécute beaucoup plus rapidement sur mon navigateur que de chaîner les appels jQuery .parent()
.
Vous pouvez donner au parent cible un identifiant ou une classe (par exemple, myParent). La référence est avec $('#element').parents(".myParent")
.
Si vous avez un parent commun, vous pouvez utiliser parentsUntil () link
par exemple: $('#element').parentsUntil('.commonClass')
L’avantage est que vous ne devez pas vous souvenir du nombre de générations entre cet élément et le parent commun (défini par commonclass).
Nous n'avons trouvé aucune réponse à l'aide de closest()
Et je pense que c'est la réponse la plus simple lorsque vous ne savez pas combien de niveaux l'élément requis est élevé, alors envoyez une réponse:
Vous pouvez utiliser la fonction closest()
combinée à des sélecteurs pour obtenir le premier élément correspondant lors du déplacement vers le haut à partir de l'élément:
('#element').closest('div') // returns the innermost 'div' in its parents
('#element').closest('.container') // returns innermost element with 'container' class among parents
('#element').closest('#foo') // returns the closest parent with id 'foo'
C'est simple. Juste utiliser
$(selector).parents().eq(0);
où 0 est le niveau parent (0 est le parent, 1 est le parent du parent, etc.)
Si vous envisagez de réutiliser cette fonctionnalité, la solution optimale consiste à créer un plugin jQuery:
(function($){
$.fn.nthParent = function(n){
var $p = $(this);
while ( n-- >= 0 )
{
$p = $p.parent();
}
return $p;
};
}(jQuery));
Bien sûr, vous souhaiterez peut-être l’étendre pour permettre un sélecteur facultatif et d’autres choses du même genre.
Remarque: ceci utilise un index basé sur 0
pour les parents, donc nthParent(0)
équivaut à appeler parent()
. Si vous préférez une indexation basée sur 1
, utilisez n-- > 0
vous pouvez aussi utiliser :
$(this).ancestors().eq(n)
ex: $(this).ancestors().eq(2)
-> le parent du parent de this
.
Ajoutez simplement le sélecteur :eq()
comme ceci:
$("#element").parents(":eq(2)")
Vous spécifiez juste quel index: 0 pour le parent immédiat, 1 pour le grand-parent, ...
Vous pouvez utiliser quelque chose comme ceci:
(function($) {
$.fn.parentNth = function(n) {
var el = $(this);
for(var i = 0; i < n; i++)
el = el.parent();
return el;
};
})(jQuery);
alert($("#foo").parentNth(2).attr("id"));
Comme parents () retourne une liste, cela fonctionne aussi
$('#element').parents()[3];
using eq semble saisir le DOM dynamique, alors que utiliser .parent (). parent () semble saisir le DOM initialement chargé (si cela est possible).
Je les utilise tous les deux sur un élément auquel des classes l'appliquent on on mouseover. eq montre les classes alors que .parent (). parent () ne le fait pas.