2010-03-04 58 views
7

Tengo una tabla con muchas filas de datos, y quiero mostrar u ocultar algunos de los detalles en cada fila en función de una casilla de verificación en el primer elemento. Por ejemplo:¿Cómo puedo obtener elementos primos con JQuery?

<table> 
    <tr> 
    <td><span class="aspnetweirdness"><input type=checkbox></span></td> 
    <td>Text Text Text</td> 
    <td><select /></td> 
    <td><input type=text></td> 
    </tr> 
</table> 

Busco a recorrer desde la casilla de verificación para los elementos primo (el texto, la selección, y la introducción de texto) con jQuery y cambiar la visibilidad de los elementos en función de si la casilla de verificación es comprobado. Un pequeño inconveniente es que la casilla de verificación está envuelta en un lapso, ya que esto está siendo generado por asp.net. Eso también hace que los elementos sean más difíciles de alcanzar con id.

¿Cómo voy a hacer esto? Intenté $ (esto) .parentsUntil ('tr'). Brothers(), pero no parece que obtenga los elementos correctos.

Cualquier ayuda sería apreciada.

EDIT:

$(".crewMemberTable input:checkbox").toggle(function() { 
      $(this).closest('tr').find('select, input:not(:checkbox)').fadeIn(); 
      $(this).closest('tr').find('label').css('font-weight', 'bold'); 
     }, function() { 
      $(this).closest('tr').find('select, input:not(:checkbox)').fadeOut(); 
      $(this).closest('tr').find('label').css('font-weight', 'normal'); 
     }); 

Respuesta

12

Bien has necesitado:

$(this).closest('tr').find('td:not(:first-child)') 

donde "este" sería el elemento casilla de verificación si el código estuviera en un manejador de "clic" o algo así.

+0

Esto me puso en el estadio, ¡gracias! – Barry

2
$('input[type=checkbox]').click(function() { 
    $(this).closest('td').siblings().find('select,input').hide(); 
}); 
+0

En realidad, probablemente no siempre quiera ocultar los otros elementos; Probablemente quiera mostrarlos cuando la casilla de verificación esté marcada, y ocultarlos de lo contrario, o tal vez viceversa. – Pointy

+0

Me doy cuenta de que él no quiere ocultarlos siempre. Fue un ejemplo de cómo encontrarlos. –

3

Sé que esta es una vieja pregunta, pero acabo de tropezar con ella y me di cuenta de que recientemente escribí una función genérica para esto.

Uso de la función por debajo de usted puede escribir simplemente $(this).cousins() para conseguir una colección que contiene el texto, seleccionar y elementos de texto de entrada (donde this es por supuesto su casilla de verificación.)

/* See http://addictedtonew.com/archives/414/creating-a-jquery-plugin-from-scratch/ 
* Used like any other jQuery function: 
*  $(selector).cousins() 
*/ 
(function($) { 
    $.fn.cousins = function() { 
     var cousins; 
     this.each(function() { 
      var auntsAndUncles = $(this).parent().siblings(); 
      auntsAndUncles.each(function() { 
       if(cousins == null) { 
        cousins = auntsAndUncles.children(); 
       } 
       else cousins.add(auntsAndUncles.children()); 
      }); 
     }); 
     return cousins; 
    } 
})(jQuery) 
+0

¿No sería mejor llamar a 'ancestros'' auntsAndUncles', ya que técnicamente no serán antepasados ​​del nodo actual? –

+0

De hecho, pensé en nombrar esa variable 'auntsAndUncles', pero decidí' antepasados' era más simple. También argumentaría que tías y tíos técnicamente * son * antepasados, pero esa es una pregunta para english.stackexchange.com;) – Rob

+0

No estoy de acuerdo, y tampoco lo hacen los diccionarios o la wikipedia: http://en.wikipedia.org/wiki/Ancestor http://dictionary.reference.com/browse/ancestor pero supongo que podrías pedir otra opinión en inglés. Sin embargo, todavía me gusta su respuesta, así que le di el voto alternativo de todos modos :) –

0

Soy nuevo en stackoverflow y no estoy seguro si puedo o no, pero edité la respuesta de @robjb y la publiqué aquí. El crédito total solo le corresponde a él.

En caso de que alguien quiera seleccionar solo primos en particular y no todos primos (es decir, quiere tener selector), entonces podemos utilizar esta versión modificada de la respuesta de @robjb. Si selector no se pasa como un argumento, entonces dará todos los primos.

(function($) { 
$.fn.cousins = function(selector) { 
    var cousins; 
    this.each(function() { 
     var auntsAndUncles = $(this).parent().siblings(); 
     auntsAndUncles.each(function() { 
      if(cousins == null) { 
       if(selector) 
        cousins = auntsAndUncles.children(selector); 
       else 
        cousins = auntsAndUncles.children(); 
      } 
      else { 
       if(selector) 
        cousins.add(auntsAndUncles.children(selector)); 
       else 
        cousins.add(auntsAndUncles.children()); 
      } 
     }); 
    }); 
    return cousins; 
    } 
})(jQuery) 

Ejemplo del uso de la función anterior sería tan

$(clickedObj).cousins('.singleWheel'); 

La otra opción sería utilizar .Filter() y respuesta uso de @ robjb.

Cuestiones relacionadas