Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Finalizar una función en una animación

Estas en el tema de Finalizar una función en una animación en el foro de Javascript en Foros del Web. Hola a todos. Estoy llevando a cabo una pequeña prueba pero aparece un bug. Aquí tenéis el enlace de la prueba: Link Básicamente es un ...
  #1 (permalink)  
Antiguo 26/08/2014, 08:23
Avatar de blancoarnau  
Fecha de Ingreso: junio-2013
Mensajes: 119
Antigüedad: 10 años, 10 meses
Puntos: 0
Finalizar una función en una animación

Hola a todos. Estoy llevando a cabo una pequeña prueba pero aparece un bug.

Aquí tenéis el enlace de la prueba: Link

Básicamente es un cuadrado rojo que va de un lado a otro pulsando el botón. El problema sucede cuando pulso tres veces seguidas el botón, que aparece dicho bug.

Lo he hecho puramente con Javascript:

Código Javascript:
Ver original
  1. function muevete(estado){
  2.   if(estado){
  3.     document.getElementById('btn').setAttribute('onclick','muevete(false)');
  4.     atras();
  5.   }else{
  6.     document.getElementById('btn').setAttribute('onclick','muevete(true)');
  7.     adelante();
  8.    }
  9. }
  10. function adelante(){
  11.   e = document.getElementById('cuadrado').style.left;
  12.   e = e.replace('%','');
  13.   e = parseInt(e,10);
  14.   if(e!=100){
  15.     e = e + 10;
  16.     document.getElementById('cuadrado').style.left=e + '%';
  17.     setTimeout(function(){adelante();},25);
  18.    }
  19. }
  20. function atras(){
  21.   a = document.getElementById('cuadrado').style.left;
  22.   a = a.replace('%','');
  23.   a = parseInt(a,10);
  24.   if(a!==0){
  25.     a = a - 10;
  26.     document.getElementById('cuadrado').style.left=a + '%';
  27.     setTimeout(function(){atras();},25);
  28.   }
  29. }

¿Alguien puede echarme un mano usando solo Javascript? No quiero usar lenguajes ajenos. He estado buscando maneras de finalizar otras funciones pero no he encontrado nada.

Os dejo el código de JSfiddle por si queréis hacer alguna prueba: Jsfiddle

¡Muchas gracias con antelación! :)
  #2 (permalink)  
Antiguo 26/08/2014, 10:09
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: Finalizar una función en una animación

Necesitas un par de variables que te sirvan como comodines para controlar el avance/retroceso del cuadrado. Por ejemplo, veo que para avanzar, el valor de e tiene que ser diferente a 100 y para retroceder, el valor de a tiene que ser diferente a 0, entonces, solo sería cuestión de que cuando en cada caso se alcance la cifra límite, cambies el valor del comodín que corresponda al movimiento contrario, así solo cuando dicha variable tenga el valor que asignas al completar el traslado del cuadrado de un lado a otro, se podrá ejecutar el desplazamiento inverso.

Código Javascript:
Ver original
  1. flagA = false; //Comodín para avanzar
  2. flagB = false; //Comodín para retroceder
  3.  
  4. function muevete(estado){
  5.     if(estado){
  6.         document.getElementById('btn').setAttribute('onclick','muevete(false)');
  7.         atras();
  8.     }else{
  9.         document.getElementById('btn').setAttribute('onclick','muevete(true)');
  10.         adelante();
  11.     }
  12. }
  13.  
  14. function adelante(){
  15.     e = document.getElementById('cuadrado').style.left;
  16.     e = e.replace('%','');
  17.     e = parseInt(e,10);
  18.  
  19.     //Solo si el comodín de avance es 'false', se ejecuta el movimiento
  20.     if (!flagA){
  21.         if(e!=100){    
  22.             e = e + 10;
  23.             document.getElementById('cuadrado').style.left=e + '%';
  24.  
  25.             //Al alcanzar el límite, cambian los valores de los comodines
  26.             if (e == 100) {
  27.                 flagB = false;
  28.                 flagA = true;
  29.             }
  30.            
  31.             setTimeout(function(){adelante();},25);
  32.         }
  33.     }
  34. }
  35.  
  36. function atras(){
  37.     a = document.getElementById('cuadrado').style.left;
  38.     a = a.replace('%','');
  39.     a = parseInt(a,10);
  40.  
  41.     //Solo si el comodín de retroceso es 'false', se ejecuta el movimiento
  42.     if (!flagB){
  43.         if(a!==0){
  44.             a = a - 10;
  45.             document.getElementById('cuadrado').style.left=a + '%';
  46.      
  47.             //Al alcanzar el límite, cambian los valores de los comodines
  48.             if (a === 0) {
  49.                 flagA = false;
  50.                 flagB = true;
  51.             }  
  52.             setTimeout(function(){atras();},25);
  53.         }
  54.     }
  55. }

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 26/08/2014, 12:13
Avatar de blancoarnau  
Fecha de Ingreso: junio-2013
Mensajes: 119
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Finalizar una función en una animación

Gracias por contestar. Es una buena idea pero así solo consigo que la función no se ejecute y no es mi intención. Mi propósito es que si pulso el botón para que el cuadrado se mueve y lo vuelvo a pulsar antes de llegue al final, el cuadrado retroceda y vuelva a su sitio original.
  #4 (permalink)  
Antiguo 26/08/2014, 15:30
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: Finalizar una función en una animación

Pues en ese caso, solo te queda cambiar el valor de los comodines al momento de ejecutarse la función y ya no cuando se alcance el final. Ya te había dado la clave, solo tenías que adaptarla a lo que necesitabas.

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

Etiquetas: finalizar, funcion, js
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 07:47.