2010-05-19 24 views
35

general:¿Cómo seleccionar el primer antepasado que coincide con un selector?

¿Cómo puedo seleccionar el primer antepasado de un elemento coincidente en jQuery?

Ejemplo:

Tome este bloque HTML

<table> 
    <tbody> 
     <tr> 
      <td> 
       <a href="#" class="remove">Remove</a> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <a href="#" class="remove">Remove</a> 
      </td> 
     </tr> 
    </tbody> 
</table> 

puedo eliminar una fila de la tabla haciendo clic en "Eliminar" utilizando el código jQuery:

$('.remove').click(function(){ 
    $(this).parent().parent().hide(); 
    return false; 
}); 

Estos trabajos , pero es bastante frágil Si alguien pone el <a> en un <div>, por ejemplo, se romperá. ¿Existe una sintaxis del selector de jQuery que sigue esta lógica:

"Aquí hay un elemento, ahora encontrar el ancestro más cercano que coincide con algunos criterios de selección y devolverlo"

Gracias

Respuesta

56

Eso sería closest:

$(this).closest('tr').hide(); 
+0

Voy a aceptar esta respuesta cuando me deja SO. Usted fue demasiado rápido. Gracias – Zach

1

Puede pasar un selector al argumento principal, creo.

$('.remove').click(function(){ 
    $(this).parents("tr:first").hide(); 
    return false; 
}); 

O puede utilizar el más cercano según lo indique otra respuesta.

$('.remove').click(function(){ 
    $(this).closest("tr").hide(); 
    return false; 
}); 
+0

No, 'parent' solo mira al padre inmediato y no a todos los ancestros. – interjay

+0

'parent' atraviesa un solo nivel del árbol DOM, usted necesitaría' parents' en su lugar. Además, la expresión del filtro debe ser 'tr: first' (sin espacio). – karim79

+1

@karim gracias, todavía no hay café cuando respondí. Modificado para reflejar – Gabriel

3

Yo prefiero usar closest como señala @Kobi a cabo (1), ya que parece ser la forma más concisa para hacer eso. Sólo para señalar, también se puede utilizar parents:

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

Buena alternativa. Acabo de ver el símbolo ': first' en el selector, ya que' parents() '(a diferencia de' closest() ') devuelve * elementos * múltiples: todos los elementos coincidentes desde el padre inmediato hacia arriba. – Dunc

0

Suponiendo que está usando jQuery 1.4, puede utilizar .parentsUntil() que devolverá todos los antepasados ​​hasta pero NO incluyendo el antepasado seleccionado.

Así que en su caso me gustaría ir con algo como esto:

$('.remove').click(function(){ 
    $(this).parentsUntil("tr").parent().hide(); 
    return false; 
}); 
Cuestiones relacionadas