Cuando quiero obtener, por ejemplo, el padre del tercer nivel del elemento que debo escribir $('#element').parent().parent().parent()
¿Hay un método más óptimo para esto?
Cuando quiero obtener, por ejemplo, el padre del tercer nivel del elemento que debo escribir $('#element').parent().parent().parent()
¿Hay un método más óptimo para esto?
Respuestas:
Como los padres () devuelven los elementos ancestrales ordenados desde los más cercanos a los externos, puede encadenarlos en eq () :
$('#element').parents().eq(0); // "Father".
$('#element').parents().eq(2); // "Great-grandfather".
$('.element').first().parents().eq(num);
[2]
devolverá el elemento DOM subyacente, utilizando eq(2)
devolverá un objeto jQuery.
Depende de tus necesidades, si sabes qué padre estás buscando, puedes usar el selector .parents ().
EG: 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());
Ejemplo usando el índice:
//First parent - 2 levels up from #Four
// I.e Selects div#One
var topTwo = $("#Four").parents().eq(2);
alert($(topTwo ).html());
Puede darle al padre objetivo una identificación o clase (por ejemplo, myParent) y la referencia es con $('#element').parents(".myParent")
Una forma más rápida es usar javascript directamente, por ejemplo.
var parent = $(innerdiv.get(0).parentNode.parentNode.parentNode);
Esto funciona significativamente más rápido en mi navegador que encadenar .parent()
llamadas jQuery .
No encontré ninguna respuesta usando closest()
y creo que es la respuesta más simple cuando no sabes cuántos niveles tiene el elemento requerido, así que publica una respuesta:
puedes usar la closest()
función combinada con selectores para obtener el primer elemento que coincida al atravesar hacia arriba desde el elemento:
('#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'
Es sencillo. Solo usa
$(selector).parents().eq(0);
donde 0 es el nivel primario (0 es primario, 1 es primario, etc.)
Simplemente agregue un :eq()
selector como este:
$("#element").parents(":eq(2)")
Simplemente especifique el índice qué padre: 0 para el padre inmediato, 1 para el abuelo, ...
Si planea reutilizar esta funcionalidad, la solución óptima es hacer un complemento jQuery:
(function($){
$.fn.nthParent = function(n){
var $p = $(this);
while ( n-- >= 0 )
{
$p = $p.parent();
}
return $p;
};
}(jQuery));
Por supuesto, es posible que desee extenderlo para permitir un selector opcional y otras cosas similares.
Una nota: esto usa un 0
índice basado para padres, por lo que nthParent(0)
es lo mismo que llamar parent()
. Si prefiere tener 1
una indexación basada, usen-- > 0
var p = 1 + n; while (p--) { $p = $p.parent(); }
y SI desea cambiar a 1 basado, Javascript es "falsey" que puede usar: while (n--) { $p = $p.parent();}
guardar una verificación condicional
nthParent(-2)
? Tu ejemplo está roto.
(function($) { $.fn.nthParent = function(n) { return $(this).parents().eq(n); }; }(jQuery));
parents
cual será incorrecto para las selecciones con más de un elemento.
var p = n >? (1 + n):1;
lugar devolvería el primer padre en ese caso en lugar de "nada", o donde se rompe el ciclo en mi ejemplo. Entonces, probablemente debería ser: (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 no desea devolver nada.
Si tiene un div padre común, puede usar parentsUntil () enlace
p.ej: $('#element').parentsUntil('.commonClass')
La ventaja es que no necesita recordar cuántas generaciones hay entre este elemento y el padre común (definido por commonclass).
también puedes usar :
$(this).ancestors().eq(n)
ex: $(this).ancestors().eq(2)
-> el padre del padre de this
.
Podrías usar algo como esto:
(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"));
el uso de eq parece capturar el DOM dinámico mientras que el uso de .parent (). parent () parece capturar el DOM que se cargó inicialmente (si eso es posible).
Los uso a ambos en un elemento que tiene clases aplicadas en onmouseover. eq muestra las clases mientras que .parent (). parent () no.