Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Problema con addEventListener!

Estas en el tema de Problema con addEventListener! en el foro de Javascript en Foros del Web. No se me ocurrió una forma sucinta de referenciar mi problema en un título. Perdón. La idea es esta: Tengo 3 divs: dos en forma ...
  #1 (permalink)  
Antiguo 16/01/2014, 16:59
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Pregunta Problema con addEventListener!

No se me ocurrió una forma sucinta de referenciar mi problema en un título. Perdón.

La idea es esta:
Tengo 3 divs: dos en forma de cuadro y el otro en círculo. Quisiera que al darle clic a un cuadrado se traslade el círculo 100px en Y. Y que al darle clic al otro cuadrado se repita la acción, a saber, que el mismo círculo se mueva desde donde estaba originalmente y corra los mismos 100px en Y.

El código que tengo no hace lo que quiero, porque al darle click al 2do cuadrado, el círculo ya está 100px en Y. ¿Cómo se le hace para que de alguna manera se reinicie la función que mueve el círculo?

Aquí el código que llevo:
Código CSS:
Ver original
  1. #caja1, #caja2, #caja3 {display:inline-block; width:100px; height:100px; background-color:#999;}
  2. #bola {width:100px; height:100px; background-color:black; border-radius:50px;}


Código Javascript:
Ver original
  1. window.onload = function()
  2. {
  3.   caja1 = document.getElementById("caja1");
  4.   caja2 = document.getElementById("caja2");
  5.   bola  = document.getElementById("bola");
  6.  
  7.   caja1.addEventListener("click", moverBola, false);
  8.   caja2.addEventListener("click", moverBola, false);
  9.  
  10.  
  11.   function moverBola()
  12.   {
  13.       bola.style.WebkitTransform = "translateY(100px)";
  14.   }
  15. }

Código HTML:
Ver original
  1. <div id="caja1">Caja 1</div>
  2.   <div id="caja2">Caja 2</div>
  3.  
  4.   <div id="bola"></div>


Estuve googleando y vi que quizá, talvez, el removeEventListener sirva a mi propósito, pero el caso es que no he logrado hacer que funcione.
Ya intenté hacerlo con animaciones CSS, de modo que cuando se dé clic se anime la ida. El resultado de esto es que sólo se anima la ida en el 1er clic. En el 2do clic ya no se anima nada. Imagino que porque la bola ya está en el destino y no en el origen. ¿Pero cómo hacer que a cada clic, se reinicie el movimiento de la bola?

Alguna idea?

Saludos cordiales

Última edición por berkeleyPunk; 16/01/2014 a las 17:17
  #2 (permalink)  
Antiguo 16/01/2014, 21:08
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 con addEventListener!

Se me ocurre hacerlo mediante un pseudo-atributo, el cual iría variando su valor y dependiendo de dicho valor, la bola sube o baja.

La bola tendría un pseudo-atributo, como puede ser data-translate y el valor "arriba":
Código HTML:
Ver original
  1. <div id="bola" data-translate="arriba"></div>

En la función, verificas el valor de dicho pseudo-atributo y según sea éste, la bola subirá o bajará:
Código Javascript:
Ver original
  1. function moverBola()
  2. {
  3.     if (bola.getAttribute("data-translate") == "arriba")
  4.     {
  5.         bola.style.WebkitTransform = "translateY(100px)";
  6.         bola.setAttribute("data-translate", "abajo");
  7.     }
  8.     else
  9.     {
  10.         bola.style.WebkitTransform = "translateY(0px)";
  11.         bola.setAttribute("data-translate", "arriba");
  12.     }
  13. }

Así es como se ve en ejecución: http://jsbin.com/ItAGAgU/2

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 17/01/2014, 09:01
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Respuesta: Problema con addEventListener!

Cita:
Iniciado por Alexis88 Ver Mensaje
Se me ocurre hacerlo mediante un pseudo-atributo
Gracias por responder, maestro Alexis88. Mi problema era más bien otro. El ejemplo que pusiste aquí http://jsbin.com/ItAGAgU/2 regresa la bola al lugar anterior, dependiendo de dónde esté.

Lo que yo quería era que se reiniciara la misma animación, el mismo movimiento que se ejecuta en la función. Por ejemplo: Tenemos un botón que al darle clic se ejecuta una función que lanza un alert. Cada vez que se presiona el botón salta el alert (siempre y cuando se cierre el alert). Si no se cierra el alert y así se da clic al botón, evidentemente no va a saltar ningún alert, porque ya hay uno abierto. Imagino que esto es lo que me pasa con mi ejemplo, que al darle clic al 2do cuadro no se ve la animación de 0px a 100px, porque la bola ya está en 100px.

Imaginaba que Javscript tenía una especie de función especial para hacer que el elemento que se anima mediante una función, se re-anime cuando se vuelve a ejecutar la misma función.
  #4 (permalink)  
Antiguo 17/01/2014, 09:13
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 con addEventListener!

En ese caso, puedes darle inicialmente una posición cero, retardas unas milésimas de segundo la siguiente acción y luego haces bajar la bolita 100px.

Código Javascript:
Ver original
  1. var caja1 = document.getElementById("caja1"),
  2.     caja2 = document.getElementById("caja2"),
  3.     bola  = document.getElementById("bola");
  4.  
  5. function moverBola()
  6. {
  7.     bola.style.WebkitTransform = "translateY(0px)";
  8.     setTimeout(function(){
  9.         bola.style.WebkitTransform = "translateY(100px)";
  10.     }, 100);
  11. }
  12.  
  13. caja1.addEventListener("click", moverBola, false);
  14. caja2.addEventListener("click", moverBola, false);

Y con esto, ya no son necesarios los pseudo-atributos, por lo que puedes eliminar data-translate de la bolita. Con setTimeout, ejecuto la bajada de la bolita luego de 100 milésimas de segundo después de que la haya dejado en su posición inicial. Puedes modificar el tiempo de retardo a tu gusto.

Así se ve: http://jsbin.com/ItAGAgU/3

Saludis
__________________
«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
  #5 (permalink)  
Antiguo 17/01/2014, 10:11
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
De acuerdo Respuesta: Problema con addEventListener!

Cita:
Iniciado por Alexis88 Ver Mensaje
En ese caso, puedes darle inicialmente una posición cero, retardas unas milésimas de segundo la siguiente acción y luego haces bajar la bolita 100px...
Algo parecido se me había ocurrido inicialmente, pero no lo hice porque, te comento, creía que JS tenía una función especial para reiniciar todo. Así como pones el código se ejecuta bien. La bronca viene si le pones transiciones CSS para que se vea el movimiento, por ejemplo a #bola: -webkit-transition:all ease 1s;

Pero haciendo unos cambios, se logra ver la animación:

Código CSS:
Ver original
  1. #caja1, #caja2, #caja3 {display:inline-block; width:100px; height:100px; background-color:#999;}
  2. #bola {
  3.     width:100px;
  4.     height:100px;
  5.     background-color:black;
  6.     border-radius:50px;
  7. }
  8.  
  9. @-webkit-keyframes ida
  10. {
  11.     0%   {-webkit-transform:translateY(0px);}
  12.     100% {-webkit-transform:translateY(100px);}
  13. }
  14. @-webkit-keyframes vuelta
  15. {
  16.     0%   {-webkit-transform:translateY(100px);}
  17.     100% {-webkit-transform:translateY(0px);}
  18. }

Código Javascript:
Ver original
  1. window.onload = function()
  2. {
  3.   caja1 = document.getElementById("caja1");
  4.   caja2 = document.getElementById("caja2");
  5.   bola  = document.getElementById("bola");
  6.  
  7.   caja1.addEventListener("click", moverBola, false);
  8.   caja2.addEventListener("click", moverBola, false);
  9.  
  10.  
  11.   function moverBola()
  12.   {
  13.       bola.style.WebkitAnimationName = 'vuelta';
  14.       bola.style.WebkitAnimationDuration = '1ms';
  15.       bola.style.WebkitAnimationTimingFunction = 'ease';
  16.       bola.style.WebkitAnimationIterationCount = '1';
  17.       bola.style.WebkitAnimationFillMode = 'forwards';
  18.  
  19.       setTimeout(function()
  20.       {
  21.           bola.style.WebkitAnimationName = 'ida';
  22.           bola.style.WebkitAnimationDuration = '1s';
  23.           bola.style.WebkitAnimationTimingFunction = 'ease';
  24.           bola.style.WebkitAnimationIterationCount = '1';
  25.           bola.style.WebkitAnimationFillMode = 'forwards';
  26.          
  27.       },1);
  28.   }
  29. }


Saludos!

Etiquetas: Ninguno
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 04:00.