2011-11-16 19 views
11

Estoy trabajando en un código para un formulario contenido en una tabla. Estoy escribiendo (con jQuery) una función para resaltar el elemento principal <td> de cada elemento <input>. Esa parte es simple - el código es simplemente:jQuery find padre superior TD

$('.myForm input').click(function(){ 
    $(this).parent().addClass('active'); 
    }) 

La parte más complicada es que algunos campos de texto están en el interior de una segunda tabla anidada dentro de una <td> de la primera tabla. Que se vería así:

<table> 
    <tr> 
     <td> <--cell I want to add the class to 
      <table> 
       <tr> 
        <td><input type='text'></td> 
       </tr> 
      </table> 
     </td> 
    </tr> 
</table> 

Así que mi pregunta es la siguiente: ¿hay una manera de utilizar una instrucción jQuery para encontrar la más alta de los padres <td> del elemento <input>? Así, en otras palabras, puedo combinar:

$('.myForm input').click(function(){ 
    $(this).parent().addClass('active'); 
    }) 

y

$('.myForm input').click(function(){ 
    $(this).parent().parent().addClass('active'); 
    }) 

en una sola función?

Respuesta

19

La mejor solución es agregar una clase a la tabla que realmente desea orientar. Esto significa que puede actualizar el marcado en el futuro sin romper necesariamente el JS, haciendo algo como $(this).closest('.targetElement').addClass('active').

Si no se puede hacer eso, puede usar parents('td').last(). Esto selecciona todos los elementos principales td y luego obtiene el último.

$('.myForm input').click(function(){ 
    $(this).parents('td').last().addClass('active'); 
}) 

Consulte el manual de jQuery:

+0

+1 por ser más rápido que yo :-P –

3

Trate de hacer esto:

$('.myForm input').click(function(){ 
    $(this).parents('td').last().addClass('active'); 
}) 
3

yo sugeriría tratando:

$(this).parents("td").last() 

encontrará todos los antepasados ​​de celda de tabla del elemento actual. El último debe contener el elemento de celda de tabla de más alto nivel.

2

que puede probar:

$(this).parents('td:last'); 

o

$(this).parents('td').last(); 
1

Dele a su alto nivel de elemento td un nombre de clase:

<table> 
    <tr> 
     <td class="topTD"> <--cell I want to add the class to 
      <table> 
       <tr> 
        <td><input type='text'></td> 
       </tr> 
      </table> 
     </td> 
    </tr> 
</table> 


$('.myForm input').click(function(){ 
    $(this).closest('td.topTD').addClass('active'); 
}); 
0

rápida & sucia :)

$(this).parents('td')[--$(this).parents('td').length] 
+1

Su código ejecuta la selección dos veces (sobrecarga innecesaria) y realiza la misma operación que [.last()] (http://api.jquery.com/last/). – lsuarez