Foros del Web » Programando para Internet » Jquery »

Problema al querer hacer una acción sobre varios elementos

Estas en el tema de Problema al querer hacer una acción sobre varios elementos en el foro de Jquery en Foros del Web. Muy buenas. Intentaré exponer el problema lo más preciso posible. Tengo una tabla en la que si el usuario pulsa sobre un enlace, se despliega ...
  #1 (permalink)  
Antiguo 09/02/2014, 13:59
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 11 años, 10 meses
Puntos: 1
Problema al querer hacer una acción sobre varios elementos

Muy buenas. Intentaré exponer el problema lo más preciso posible. Tengo una tabla en la que si el usuario pulsa sobre un enlace, se despliega cuerta información haciendo visible un tr inicialmente oculto. Esta es la estructura general:
Código HTML:
Ver original
  1.     <tbody>
  2.         <tr></tr>
  3.         <tr class="ocultable oculto"></tr>
  4.         <tr></tr>
  5.         <tr class="ocultable oculto"></tr>
  6.         <tr></tr>
  7.         <tr class="ocultable oculto"></tr>
  8.     </tbody>

La clase "ocultable" no tiene estilos asociados, la uso sólo para detectar el tr luego con jquery. La clase "oculto" simplemente tiene como estilo "display: none".

Bien, en los tr que no están ocultos se muestra cierta información y cuando el usuario pulsa sobre un enlace contenido en ese tr quiero que se haga visible el tr oculto siguiente. Y si ya estuviera visible, que se oculte. Esto es fácil y no me da problemas.

Código Javascript:
Ver original
  1. $('.nombre_alumno').click(function() {
  2.     var ref = $(this).parents("tr").next();
  3.     if (ref.hasClass("oculto")) {
  4.         ref.removeClass("oculto");
  5.     }
  6.     else {
  7.         ref.addClass("oculto");
  8.     }
  9. });

Además, tengo dos enlaces fuera de la tabla para mostrar todos los tr ocultos y para ocultarlos. Y aquí es donde viene el problema. Este es el código que uso para esto:

Código Javascript:
Ver original
  1. $('.desplegar').click(function() {
  2.     // Selecciono todos los tr
  3.     var ref = $(".central_section").find("#mostrar_trabajo_wrapper").find("tr");
  4.     // Si tienen la clase oculto, la quito
  5.     if (ref.hasClass("oculto")) {
  6.         ref.removeClass("oculto");
  7.     }
  8. });
  9.  
  10. $('.recoger').click(function() {
  11.     // Selecciono todos los tr con la clase ocultable
  12.     var ref = $(".central_section").find("#mostrar_trabajo_wrapper").find(".ocultable");
  13.     // Si no tienen la clase oculto, la añado
  14.     if (!ref.hasClass("oculto")) {
  15.         ref.addClass("oculto");
  16.     }
  17. });

La función de desplegar funciona perfectamente, pero la de recoger sólo funciona si ninguno los tr con la clase "ocultable" tienen la clase "oculto", es decir, que si hay desplegado al menos uno de los tr, no funciona.

Si me pudierais decir donde está el fallo os lo agradecería.

Saludos.
  #2 (permalink)  
Antiguo 09/02/2014, 19:58
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Problema al querer hacer una acción sobre varios elementos

Creo que debes buscar los elementos a afectar directamente por el nombre de su clase y no estar recorriendo tantos elementos previos.

Inténtalo así:

Código Javascript:
Ver original
  1. var ref = $(".ocultable"); //Aquí tomo solamente a los TR con la clase "ocultable"
  2.  
  3. $('.desplegar').click(function() {
  4.     if (ref.hasClass("oculto")) {
  5.         ref.removeClass("oculto");
  6.     }
  7. });
  8.  
  9. $('.recoger').click(function() {
  10.     if (!ref.hasClass("oculto")) {
  11.         ref.addClass("oculto");
  12.     }
  13. });

Así se vería: http://jsbin.com/cedo/1

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #3 (permalink)  
Antiguo 16/02/2014, 07:29
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 11 años, 10 meses
Puntos: 1
Respuesta: Problema al querer hacer una acción sobre varios elementos

Gracias por tu respuesta. Siento la tardanza en responder, pero he estado fuera esta semana. Ví el ejemplo funcionando cuando respondiste pero no tenía el ordenador donde guardo el código de la web en desarrollo para probarlo.
Lo he probado ahora y sigue pasando lo mismo :(

Igualmente gracias por tu respuesta.
  #4 (permalink)  
Antiguo 16/02/2014, 12:20
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Problema al querer hacer una acción sobre varios elementos

Muéstranos el código actualizado para ver en dónde estás fallando y así poder ayudarte.

Edito: Acabo de darme cuenta que el JSBin que te pasé hace ya varios días, ha caducado, de modo que te paso este JSFiddle actualizado: http://jsfiddle.net/mk2eU/

Por si a caso, también te dejo el código acá:

Código Javascript:
Ver original
  1. var r = $(".ocultable");
  2.  
  3. $('.nombre_alumno').click(function() {
  4.     var ref = $(this).parents("tr").next();
  5.     if (ref.hasClass("oculto"))
  6.         ref.removeClass("oculto");
  7.     else
  8.         ref.addClass("oculto");
  9. });
  10.  
  11. $('.desplegar').click(function() {
  12.     r.removeClass("oculto");
  13. });
  14.  
  15. $('.recoger').click(function() {
  16.     r.addClass("oculto");
  17. });
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 16/02/2014 a las 15:03
  #5 (permalink)  
Antiguo 17/02/2014, 05:14
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 11 años, 10 meses
Puntos: 1
Respuesta: Problema al querer hacer una acción sobre varios elementos

He creado una cuenta en fiddle, que no tenía. A ver si lo he hecho bien y puedes verlo.

http://jsfiddle.net/DandyCC/DthVy/

Si pinchas sobre un "nombre_alumno" se despliega la información. Si con uno desplegado pinchas sobre recojer, no se recoge.

Gracias de nuevo por tu tiempo!!
  #6 (permalink)  
Antiguo 17/02/2014, 11:39
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Problema al querer hacer una acción sobre varios elementos

¿Y por qué no lo haces como te lo indiqué si ves que de ese modo sí funciona?

Fíjate en el JSFiddle que te dejé.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #7 (permalink)  
Antiguo 17/02/2014, 15:06
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 11 años, 10 meses
Puntos: 1
Respuesta: Problema al querer hacer una acción sobre varios elementos

Uy! Disculpa, copié ahí mi código original, no el modificado. Ya está

http://jsfiddle.net/DandyCC/z579G/
  #8 (permalink)  
Antiguo 17/02/2014, 16:38
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Problema al querer hacer una acción sobre varios elementos

Tuve que hacerle varias correcciones a tu código para que funciones, entre ellas, [U]crear la clase oculto[U] (¿cómo pretendías ocultar las filas? ), además, quité la propiedad display: none que desacertadamente le asignaste a cada Div que se encuentra dentro de cada fila oculta. Saqué un par de Divs "wrapper" porque era innecesario tener un Div dentro de otro si ni siquiera estabas realizando algo con él.

Aquí tienes el código actualizado: http://jsfiddle.net/sRJ44/

Y por favor, la próxima vez diseña con más cuidado y evita usar tablas, las cuales solamente deben ser utilizadas para listar información, no para alinear elementos, para eso están los estilos.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #9 (permalink)  
Antiguo 21/02/2014, 05:44
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 11 años, 10 meses
Puntos: 1
Respuesta: Problema al querer hacer una acción sobre varios elementos

Hola y gracias por contestar de nuevo. Siento la tardanza, los viajes me están matando!!

La clase "oculto" está declarada en la web pero se me olvidó añadirla ahí. Lo siento.

Con respecto a la propiedad display: none que se encuentra dentro de cada fila oculta, es necesaria para la animación slideDown y slideUp. Estas animaciones no funcionan con las etiquetas tr, no sé exactamente por qué, así que para conseguir ese efecto tuve que ocultar los tr y el div de dentro. Así, cuando se tiene que mostrar un tr oculto primero elimino la clase "oculto" y luego aplico la animación al div de dentro. Y cuando se tiene que ocultar un tr, primero aplico la animación y luego oculto el tr con esta instrucción:

Código Javascript:
Ver original
  1. ref.find(".alumno_respuesta").slideUp("fast", function () {
  2.      ref.addClass("oculto");
  3. });

De todas formas me he fijado que en la solución que me has puesto funciona perfectamente "Desplegar todo" y "Recoger todo", pero no se oculta nada cuando hago click en "Nombre del alumno".

Si no soy capaz de encontrar la solución a esto eliminaré las opciones de "Desplegar todo" y "Recoger todo", aunque me da mucha rabia saber que algo se puede hacer pero no ser capaz de hacerlo!
  #10 (permalink)  
Antiguo 21/02/2014, 16:26
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Problema al querer hacer una acción sobre varios elementos

Disculpa, se me olvidó añadir y quitar la clase oculto. Ya lo actualicé: http://jsfiddle.net/wkqQY/

Y con respecto a lo del slide, si me hubieras hecho caso y hubieras dejado de maquetar con tablas, no tendrías problemas. Para muestra, un botón:

DEMO
CÓDIGO FUENTE

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 21/02/2014 a las 16:31
  #11 (permalink)  
Antiguo 25/02/2014, 06:43
 
Fecha de Ingreso: junio-2012
Mensajes: 147
Antigüedad: 11 años, 10 meses
Puntos: 1
Respuesta: Problema al querer hacer una acción sobre varios elementos

Tienes razón, debería haberlo rehecho. Voy a intentarlo sin la tabla a ver si me quito este problema de una vez de encima.

Muchas gracias de nuevo!!

Etiquetas: elementos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:43.