Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Error con efecto fade

Estas en el tema de Error con efecto fade en el foro de Frameworks JS en Foros del Web. Tengo un div contenedor de otros divs. He creado un script en JQuery para que al pulsar en uno de los div's interiores ocurra lo ...
  #1 (permalink)  
Antiguo 01/04/2011, 17:36
 
Fecha de Ingreso: noviembre-2009
Mensajes: 846
Antigüedad: 15 años
Puntos: 34
Error con efecto fade

Tengo un div contenedor de otros divs. He creado un script en JQuery para que al pulsar en uno de los div's interiores ocurra lo siguiente.

1.- Se carga en un div (display:none) una pagina.
2.- Se pone a semitransparente con un fadeTo el div fila (contenedor de los otros).
3.- Se muestra el div donde se ha cargado la pagina.
4.- Si se hace click fuera, el proceso se invierte. Todo queda disponible para volver a funcionar.


El error: cuando pasa esto por segunda vez todo va bien excepto que el dic que se pone semitransparente se vuelve a poner bien antes de hacer click.

Código Javascript:
Ver original
  1. function produ(id) {
  2.     $(document).ready(function(){
  3.         $(".fila").fadeTo("slow",0.5, function () {
  4.             $(".produ").load('producto.php?id='+id,function(){
  5.                $(".produ").fadeIn("slow", function() {
  6.                   $(".cuerpo").click(function(){
  7.                      $(".produ").fadeOut("slow");
  8.                      $(".fila").fadeTo("slow",1);
  9.                   });
  10.                });
  11.             });
  12.           });
  13.         });
  14. };
Código HTML:
Ver original
  1. <div class="cuerpo">
  2.    <div class="box" onclick="produ(345)">
  3.    </div>
  4.    <div class="box" onclick="produ(346)">
  5.    </div>
  6. </div

Espero haberme explicado bien
Un saludo.
  #2 (permalink)  
Antiguo 01/04/2011, 17:59
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Error con efecto fade

Que tal mariomon17,

falta markup ahi, donde esta fila y produ ?, igual te comento que estas utilizando jQuery a medias, a ver, deberías organizarlo un poco, la función produ va fuera del ready y el evento click asignalo a través de jQuery, algo así para empezar:

Código Javascript:
Ver original
  1. function produ(e) {
  2.     e.preventDefault();
  3.     var id = $(this).attr('id').replace('item-', '');
  4.     $(".fila").fadeTo("slow",0.5, function () {
  5.         $(".produ").load('producto.php?id='+id,function(){
  6.            $(".produ").fadeIn("slow", function() {
  7.               $(".cuerpo").click(function(){
  8.                  $(".produ").fadeOut("slow");
  9.                  $(".fila").fadeTo("slow",1);
  10.               });
  11.            });
  12.         });
  13.     });
  14. }
  15.  
  16. $(document).ready(function(){
  17.    $('.box').click(produ);
  18. });

y ajusta el html, así:

Código HTML:
Ver original
  1. <div class="cuerpo">
  2.    <div class="box" id="item-345">
  3.    </div>
  4.    <div class="box" id="item-345">
  5.    </div>
  6. </div>

hace estos ajustes y postea el resto del markup, tanto $ anidado en elementos que están relacionados no esta bien.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 01/04/2011, 23:17
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 7 meses
Puntos: 1284
Tema movido desde javascript
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #4 (permalink)  
Antiguo 02/04/2011, 13:17
 
Fecha de Ingreso: noviembre-2009
Mensajes: 846
Antigüedad: 15 años
Puntos: 34
Respuesta: Error con efecto fade

Quise hacer un esquema y me olvide de ciertos divs.

Seria asi:
Código HTML:
Ver original
  1. <div class="produ" style="display:none">
  2. </div>
  3.  
  4. <div class="cuerpo">
  5.   <div class="fila">
  6.       <div class="box" id="345">
  7.       </div>
  8.       <div class="box" id="346">
  9.       </div>
  10.   </div>
  11. </div


Muchas gracias, soy novato en JQuery y eso fue la unica forma que se me ocurrio.
Voy a probarlo y te cuento como va.

Un saludo
  #5 (permalink)  
Antiguo 02/04/2011, 15:18
 
Fecha de Ingreso: noviembre-2009
Mensajes: 846
Antigüedad: 15 años
Puntos: 34
Respuesta: Error con efecto fade

Ya lo probe y me funciono perfectamente. Ahora voy a implementarle efectos propios del nucleo UI, a ver que tal...

El codigo final, lo dejo por aqui:
Código Javascript:
Ver original
  1. $(document).ready(function(){
  2.    $('.box').click(produ);
  3. });
  4.  
  5. function produ(e) {
  6.         e.preventDefault();
  7.         var id = $(this).attr("id");
  8.  
  9.         $("body").addClass("loading");
  10.  
  11.         $(".produ").load('producto.php?id='+id,function(){
  12.             $(".fila").fadeTo("slow",0.5, function () {
  13.                $(".produ").fadeIn("slow");
  14.                            
  15.                            $("body").removeClass("loading");
  16.  
  17.             })
  18.         })
  19.            
  20.         $(".cuerpo").click(function(){
  21.             $(".produ").fadeOut("slow");
  22.             $(".fila").fadeTo("slow",1);
  23.         });
  24. };

Pero me quedo con tres dudas:
1.- Para que se utiliza el e.preventDefault() en este caso en concreto y que ocurriria si no lo pongo dentro de $ document.ready.
3.- Cual seria el mejor metodo para, por ejemplo, cambiar el cursor del raton mientras el load carga el documento en el div. El metodo que he puesto en el codigo no funciona bien pero creo que eso es mas cuestion de CSS...

Gracias, un saludo

Última edición por mariomon17; 02/04/2011 a las 15:27
  #6 (permalink)  
Antiguo 02/04/2011, 15:43
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Error con efecto fade

1 - En este caso preventDefault no hace nada, fue mas costumbre que otra cosa, pero es para prevenir la propagación del evento, en un link por ejemplo si no haces un preventDefault se recarga la pagina.

2 - te dejo el enlace a ready http://api.jquery.com/ready/, pero la idea es poder ejecutar el js lo mas rápido posible, cuando el DOM este listo, a diferencia de load no espera por la carga de imágenes.

3 - lo que se suele hacer es agregar el loader a la capa de destino, produ en tu caso.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #7 (permalink)  
Antiguo 03/04/2011, 14:37
 
Fecha de Ingreso: noviembre-2009
Mensajes: 846
Antigüedad: 15 años
Puntos: 34
Respuesta: Error con efecto fade

Gracias por las aclaraciones. El nuevo codigo (con efectos de JQUERY UI)es este:
Código Javascript:
Ver original
  1. $(document).ready(function(){
  2.    $('.box').click(produ);
  3. });
  4.  
  5. function produ(e) {
  6.     e.preventDefault();
  7.         var id = $(this).attr("id");
  8.         $(".produ").load('../productos/producto.php?id='+id+' #pro',function(){
  9.                 $(".fila").fadeTo("slow",0);
  10.                 $(".produ").show("scale","","slow", function(){
  11.                     $(".cuerpo").click(function(){
  12.                         $(".produ").hide("scale","","slow");
  13.                         $(".fila").show("drop","","slow");
  14.                     });
  15.                 });
  16.         })     
  17.    
  18. };

Pero no funciona :S ocurre lo siguiente:
Hago click en .box y entra .produ y sale .fila.
Si hago click en .cuerpo .produ se va y .fila vuelve pero al instante desaparece.
Si pulsas en document aparece de repente .produ que se va con el efecto, y .fila entra otra vez con el efecto pero desaparece de repente. Asi infinitamente :S

Un saludo y gracias
  #8 (permalink)  
Antiguo 09/04/2011, 15:30
 
Fecha de Ingreso: noviembre-2009
Mensajes: 846
Antigüedad: 15 años
Puntos: 34
Respuesta: Error con efecto fade

Código Javascript:
Ver original
  1. $(document).ready(function () {
  2.     $(".box").click(mostrar);  
  3. })
  4.  
  5. function mostrar(e) {
  6.     var id = $(this).attr("id");
  7.     $(".productos").fadeTo("slow",0.5);
  8.     $(".produ").show("scale","","slow");
  9.     $(".produ").addClass("loading");
  10.     $(".produ").load('../productos/producto.php?id='+id+' #pro',function(){
  11.         $(".produ").removeClass("loading");
  12.         $(document).click(ocultar)
  13.     } );
  14. }
  15.  
  16.  
  17.  
  18.  
  19. function ocultar(e) {
  20.     var a = $(".produ").css("display");
  21.     if(a != "none") {
  22.         $(".produ").hide("scale","","slow");
  23.         $(".productos").fadeTo("slow",1);
  24.     }
  25. }

El codigo lo he dejado en esto... va mejor y mucho mas rapido pero sigue con el problema de que la funcion "se queda abierta".

Entonces cada vez que pulso document se ejecuta el ocultar de ahora y el de todas las veces anteriores xD

Como habria que hacer para que solo se pudiese ejecutar una vez, o algo para "cerrar", "salir" de la funcion?

Gracias
  #9 (permalink)  
Antiguo 23/04/2011, 08:48
 
Fecha de Ingreso: noviembre-2009
Mensajes: 846
Antigüedad: 15 años
Puntos: 34
[SOLUCIONADO] Error con efecto fade

Ya descubri la solucion, se trata de la funcion .one() que hace que la funcion (valga la redundancia) solo se ejecute one vez.

La sintaxis podeis encontrarla en el manual de JQuery.

Al final el codigo quedo asi:
Código Javascript:
Ver original
  1. $(document).ready(function () {
  2.     $(".box").click(mostrar);  
  3. })
  4.  
  5. function mostrar(e) {
  6.     var id = $(this).attr("id");
  7.     $(".productos").fadeTo("slow",0.5);
  8.     $(".produ").show("scale","","slow");
  9.     $(".produ").addClass("loading");
  10.     $(".produ").load('../productos/producto.php?id='+id+' #pro',function(){
  11.         $(".produ").removeClass("loading");
  12.         $(document).one("click", ocultar)
  13.     } );
  14. }
  15.  
  16.  
  17.  
  18.  
  19. function ocultar(e) {
  20.     var a = $(".produ").css("display");
  21.     if(a != "none") {
  22.         $(".produ").hide("scale","","slow");
  23.         $(".productos").fadeTo("slow",1);
  24.     }
  25. }

Un saludo

Etiquetas: efecto, fade, javascript
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:53.