Foros del Web » Programando para Internet » Jquery »

jQuery: Evento después de terminar each()

Estas en el tema de jQuery: Evento después de terminar each() en el foro de Jquery en Foros del Web. Hola a todos, estoy haciendo mi primer trabajo con jQuery. Es una web con 4 secciones y un menú superior con los 6 apartados. Cuando ...
  #1 (permalink)  
Antiguo 28/08/2010, 15:01
 
Fecha de Ingreso: agosto-2003
Mensajes: 122
Antigüedad: 20 años, 7 meses
Puntos: 0
jQuery: Evento después de terminar each()

Hola a todos,

estoy haciendo mi primer trabajo con jQuery. Es una web con 4 secciones y un menú superior con los 6 apartados. Cuando haces click en "1" se despliega la sección correspondiente y así con las 6 opciones.

Ahora bien, tengo un problema. Si has visitado la primera vez la sección "2" y haces click en el menú en "4", quiero que "2" se pliegue automáticamente y se despliegue "4".

Para no complicarme mucho, he pensado que lo mejor era hacer un each() de todos los elementos y plegarlos antes de desplegar el siguiente. Es decir, cuando haces click en cualquier opción del menú, hago un each() de todas las secciones y las pliego, desde la "1" a la "6". Y luego despliego la del click (la"4" siguiendo el ejemplo de antes).

El problema, si uso esta opción, es que el pliegue se ejcuta más lento que el despliegue, y siempre acaban cerrándose todas las secciones:

Código HTML:
temp = this.id;
if($(this).hasClass('clicked')){
$("#menu > img").each(function (){
	pliega("#"+this.id);
});
despliega("#"+temp);
He probado también pasando un contador a la función y haciendo:
Código HTML:
//Cuando estamos en el último elemento...
if (i == 6){
     despliega("#"+temp);
}
pero también se adelanta y no funciona correctamente.

Me gustaría saber si es posible ejecutar un evento cuando termine el each(), en orden y sin adelantarse a la finalización del último elemento.

¿Alguna idea? ¡Gracias!
  #2 (permalink)  
Antiguo 28/08/2010, 15:11
Avatar de tredio  
Fecha de Ingreso: noviembre-2008
Ubicación: Carabobo
Mensajes: 466
Antigüedad: 15 años, 4 meses
Puntos: 66
Respuesta: jQuery: Evento después de terminar each()

podiras hacer algo asi, como no se que tiempo toma plegar o desplegar le cambias algunos valores que pongo.

Código Javascript:
Ver original
  1. temp = this.id;
  2. if($(this).hasClass('clicked')){
  3.    var tam = $("#menu > img").length;
  4.    $("#menu > img").each(function (i){
  5.     pliega("#"+this.id);
  6.         if(i==(tam-1))
  7.            setTimeout(function(){despliega("#"+temp);},tiempo_que_toma_plegar);
  8.    });
  #3 (permalink)  
Antiguo 28/08/2010, 15:18
 
Fecha de Ingreso: agosto-2003
Mensajes: 122
Antigüedad: 20 años, 7 meses
Puntos: 0
Respuesta: jQuery: Evento después de terminar each()

Hola tredio,

gracias por tu respuesta.

En caso de no encontrar algo mejor tendré que hacerlo así, pero creo que tiene que haber una forma más correcta de hacerlo. El tiempo que le lleva plegarse puede depender del navegador o el ordenador en el que se ejecute y tampoco quiero poner un valor demasiado alto que me asegure la espera pero que ralentice demasiado la navegación y se resienta la usabilidad con usuarios esperando 2 ó 3 segundos. Si me quedo corto el resultado sería también malo.

A ver si alguien tiene una forma mejor. Gracias igualmente ;).
  #4 (permalink)  
Antiguo 28/08/2010, 15:50
Avatar de tredio  
Fecha de Ingreso: noviembre-2008
Ubicación: Carabobo
Mensajes: 466
Antigüedad: 15 años, 4 meses
Puntos: 66
Respuesta: jQuery: Evento después de terminar each()

puedes hacer algo muy facil pasar una funcion como parametro de pliega(); y ejecutarla al final de la misma si existe, lo que te puse fue por que ya lo estabas haciendo asi, y no tengo muchos datos de otra forma de hacerlo con el poco codigo que pusiste.

Código Javascript:
Ver original
  1. temp = this.id;
  2. if($(this).hasClass('clicked')){
  3.    var tam = $("#menu > img").length;
  4.    $("#menu > img").each(function (i){
  5.     pliega("#"+this.id);
  6.         if(i==(tam-1))
  7.            pliega("#"+this.id,function(){
  8.               despliega("#"+temp);
  9.            });
  10.    });

prueba algo asi, no estoy muy seguro si te va a agarrar la variable temp, tambien tedras que hacerle modificaciones a pliega()
  #5 (permalink)  
Antiguo 30/08/2010, 02:35
 
Fecha de Ingreso: agosto-2003
Mensajes: 122
Antigüedad: 20 años, 7 meses
Puntos: 0
Respuesta: jQuery: Evento después de terminar each()

Gracias tredio. Lo he hecho así modificando alguna cosa más y va de lujo ;).

¡Un saludo!
  #6 (permalink)  
Antiguo 30/08/2010, 05:28
 
Fecha de Ingreso: diciembre-2009
Ubicación: Misiones
Mensajes: 867
Antigüedad: 14 años, 4 meses
Puntos: 65
Respuesta: jQuery: Evento después de terminar each()

Código HTML:
Ver original
  1. <title>Prueba</title>
  2. <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
  3.    
  4. $(function (){
  5.     //Click en h3 que no tengan clase 'active'
  6.     $('h3:not(.active)').click( function(){
  7.         //Busco el h3 con clase 'active', elimino la clase 'active' y lo oculto el div que le sigue
  8.         $(this).siblings('.active').removeClass('active').next().slideToggle();
  9.         //Argego clase 'active' y muestro el div que le sigue
  10.         $(this).addClass('active').next().slideToggle();
  11.     });
  12. })
  13.     div{display:none}
  14. </head>
  15.  
  16. <h3>1</h3>
  17. <div>uno</div>
  18. <h3>2</h3>
  19. <div>dos</div>
  20. <h3>3</h3>
  21. <div>tres</div>
  22. <h3>4</h3>
  23. <div>cuatro</div>
  24. <h3>5</h3>
  25. <div>cinco</div>
  26. <h3>6</h3>
  27. <div>seis</div>
  28.  
  29. </body>
  30. </html>

Etiquetas: terminar, eventos
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 17:49.