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?
javascript
jquery
parent
Artur Keyan
fuente
fuente
Respuestas:
Como los padres () devuelven los elementos ancestrales ordenados desde los más cercanos a los externos, puede encadenarlos en eq () :
fuente
$('.element').first().parents().eq(num);
[2]
devolverá el elemento DOM subyacente, utilizandoeq(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/
Ejemplo usando el índice:
fuente
Puede darle al padre objetivo una identificación o clase (por ejemplo, myParent) y la referencia es con
$('#element').parents(".myParent")
fuente
Una forma más rápida es usar javascript directamente, por ejemplo.
Esto funciona significativamente más rápido en mi navegador que encadenar
.parent()
llamadas jQuery .Ver: http://jsperf.com/jquery-get-3rd-level-parent
fuente
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:fuente
Es sencillo. Solo usa
donde 0 es el nivel primario (0 es primario, 1 es primario, etc.)
fuente
Simplemente agregue un
:eq()
selector como este:Simplemente especifique el índice qué padre: 0 para el padre inmediato, 1 para el abuelo, ...
fuente
Si planea reutilizar esta funcionalidad, la solución óptima es hacer un complemento 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 quenthParent(0)
es lo mismo que llamarparent()
. Si prefiere tener1
una indexación basada, usen-- > 0
fuente
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 condicionalnthParent(-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).
fuente
también puedes usar :
ex:
$(this).ancestors().eq(2)
-> el padre del padre dethis
.fuente
Podrías usar algo como esto:
http://jsfiddle.net/Xeon06/AsNUu/
fuente
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.
fuente
Como los padres () devuelve una lista, esto también funciona
fuente