2010-09-30 9 views
29

tengo este código HTML:.jQuery parent() ("selector")

<tr> 
    <td><input type="checkbox" class="chk" /></td> 
    <td><div class="disabled">text to hide 1</div></td> 
    <td><div class="disabled">text to hide 2</div></td> 
</tr> 

estoy usando jQuery para ocultar todos los artículos: class="disabled"

$("div.disabled").hide() ; 

que quiero mostrar divs con discapacidad cuando hago clic en la casilla de verificación en la misma fila (tr). Probé

$("input.chk").click(function(){ 
    $(this).parent().parent().(".disabled").show(); 
}) ; 

pero no funciona.

Respuesta

65

Uso .closest() y .find(), así:

$("input.chk").click(function(){ 
    $(this).closest('tr').find(".disabled").show(); 
}); 

su código actual casi obras, se necesita un .find() embargo, como esto:

$(this).parent().parent().find(".disabled").show(); 

Si tiene muchos filas así, use .delegate(), así:

$("table").delegate("input.chk", "click", function(){ 
    $(this).closest('tr').find(".disabled").show(); 
}); 

.delegate() en su lugar enlaza un controlador a la tabla para que todos los elementos input.chk burbujeen hasta. Si usted está buscando para activar/desactivar, utilizar y change.toggle(), además de lo anterior, así:

$("table").delegate("input.chk", "change", function(){ 
    $(this).closest('tr').find(".disabled").toggle(this.checked); 
}); 

esta manera, si se comprueba que muestran, si no se esconden.

+1

.closest() se llevó obsoleto y eliminado en 1.8 http://api.jquery.com/closest/ (véase la parte inferior de la página) Busque http : //api.jquery.com/parentsUntil/ –

+0

Si realmente mira el enlace, lo más cercano no está en desuso, solo una firma en particular. No veo nada que indique una preferencia por los padres hasta el momento más cercano. – Danwizard208

2

Casi. Solo falta la palabra find para indicar jQuery's .find() method.

$("input.chk").click(function(){ 
    $(this).parent().parent().find(".disabled").show(); 
}) ; 

O, una versión más corta es use .closest().

$("input.chk").click(function(){ 
    $(this).closest('tr').find(".disabled").show(); 
}); 

Usted también podría use .parents(), aunque que se quiere indicar the :first partido en caso de tener tablas anidadas.

$("input.chk").click(function(){ 
    $(this).parents('tr:first').find(".disabled").show(); 
}); 
0

Es incluso más fácil que eso.

$(".disabled").hide(); 
    $(".chk").click(function(){ 
     if($(this).is(":checked")) 
     { 
      $(this).siblings(".disabled").show(); 
     } 
     else 
     { 
      $(this).siblings(".disabled").hide(); 
     } 
    }); 

incluso añade algunas funciones extra para que el evento no sólo se disparará una vez, sino que cambia en función de si la casilla de verificación está marcada o no.

+0

Los elementos no son hermanos, están en celdas de tabla diferentes :) * si * lo fueran, el método corto sería: '$ (". Chk "). Change (function() {$ (this) .siblings (".disabled"). toggle (this.checked);}); ' –

+0

Supuse que eran hermanos porque estaban en el mismo nivel contenido en un elemento primario compartido. Estaba siguiendo tu conversación con nubbel y tienes razón, estaba haciendo lo mismo con y no

. – Eric

0

Y es aún más fácil:

$(".disabled").hide(); 
$(".chk").click(function() { 
    $(this).siblings(".disabled").toggle(); 
});​ 

:-)

+0

Como ya comenté en la otra respuesta (además de esto, no da cuenta del estado inicial), los elementos '.disabled' no son hermanos :) –

+0

Eso creía y estaba por comentar a Eric, pero lo probé: http : //jsfiddle.net/jpQcu/. Parece que '$ .siblings()' devuelve elementos que están en la misma profundidad del árbol. Creo que '$ .nextAll()' es lo que queríamos decir. – nubbel

+0

@nubbel - '.nextAll()' también es * solo * para hermanos :) –

3

Sí utilizando find() y closest() es definitivamente el procedimiento correcto. Hay un estilo diferente de escribir lo mismo. El fragmento de código está aquí.

$("input.chk").click(function() { 
     var th = $(this); 
     $(".disabled", th.parent().parent()).show(); 
}); 
+0

Tiene un error de sintaxis allí, en la línea 3 :) –

+0

@Shrikant Sharat Gracias. He corregido mi respuesta :). – Anji