Foros del Web » Programando para Internet » Javascript »

Problema para evitar apilamientos de registro de eventos

Estas en el tema de Problema para evitar apilamientos de registro de eventos en el foro de Javascript en Foros del Web. Buenas, No encuentro la forma de evitar que se me llene la pila de registro de eventos del tipo MouseOver, he intentado remover esos eventos ...
  #1 (permalink)  
Antiguo 27/05/2014, 12:04
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Problema para evitar apilamientos de registro de eventos

Buenas,

No encuentro la forma de evitar que se me llene la pila de registro de eventos del tipo MouseOver, he intentado remover esos eventos con MouseOut pero no lo logro

Si ven en el este script que he escrito, si se pasa muchas veces por encima del caminante este acelera su paso debido a la clonacion de la funcion moveMeHor()

Código Javascript:
Ver original
  1. <html>
  2. <head>
  3. <title>No molestar!</title>
  4. <style>
  5.     body {background-color: #000;} 
  6.    
  7.     h1 {color: white;}
  8.  
  9.    #moverDiv
  10.    {
  11.         width:350px;
  12.         height:350px;
  13.         background-image: url("http://oi54.tinypic.com/28k3pjo.jpg");
  14.         border: red 2px;
  15.         position:relative;
  16.    }
  17. </style>
  18. </head>
  19. <body>
  20. <h1> No me molestes </h1>
  21.  
  22. <div id = "moverDiv"></div>
  23.  
  24. <script>
  25.     // @author: Pablo Bozzolo
  26.    
  27.     function moveMeHor(elem,cant,smooth)
  28.     {
  29.         smooth = smooth || false;
  30.        
  31.         elem.removeEventListener('mouseover',miHandler,false);
  32.        
  33.         if (!smooth){
  34.             elem.style.left = cant;
  35.             return;
  36.         }  
  37.    
  38.         (function(){           
  39.            
  40.             i = 0;
  41.             inter = setInterval(function()
  42.             {  
  43.                 if (i>cant)
  44.                 {                  
  45.                     i=0;
  46.                 }          
  47.            
  48.                 if (i==cant)
  49.                 {
  50.                     clearInterval(inter);
  51.                     div.addEventListener ('mouseover',miHandler,false);                
  52.                 }              
  53.                 elem.style.left = i;
  54.                 i++;
  55.                
  56.             },1);
  57.         })();  
  58.        
  59.        
  60.     }
  61.    
  62.     window.onload = function()
  63.     {  
  64.         div = document.getElementById('moverDiv'); 
  65.  
  66.         miHandler = function(){moveMeHor(div,500,true);};  
  67.         miHandler2 = function(){console.log('removiendo handler1'); div.removeEventListener('mouseover',miHandler,false);};
  68.            
  69.         // espero un tiempito segundo antes de registrar el mouseover  
  70.         setInterval(function(){
  71.             div.addEventListener ('mouseover',miHandler,false);
  72.             div.addEventListener ('mouseout',miHandler2,false);
  73.         },500);
  74.     }
  75.        
  76. </script>
  77. </body>
  78. </html>

Graciass!
__________________
Salu2!

Última edición por Italico76; 27/05/2014 a las 12:15
  #2 (permalink)  
Antiguo 27/05/2014, 17:45
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años, 6 meses
Puntos: 528
Respuesta: Problema para evitar apilamientos de registro de eventos

No estoy muy seguro de entender el problema, pero ¿no radica en que usas setInterval en vez de setTimeOut?
  #3 (permalink)  
Antiguo 27/05/2014, 17:57
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Problema para evitar apilamientos de registro de eventos

Cita:
Iniciado por ocp001a Ver Mensaje
No estoy muy seguro de entender el problema, pero ¿no radica en que usas setInterval en vez de setTimeOut?
Estoy perdido.... uso setInterval() porque fue el primero que aprendi aunque voy a revisar la documentacion de setTimeOut()

El problema ? lo que pasa es que no se termina de mover el div y se generan nuevos eventos y se ejecutan nuevas instancias de la funcion que lo mueve y eso hace que se acelere y que despues de terminado el movimiento vuelva a comenzar otro monton de veces!!!

La falla es facil de ver... mueve el cursor dentro y fuera del div en movimiento varias veces rapidamente y veras lo que me pasa
__________________
Salu2!
  #4 (permalink)  
Antiguo 27/05/2014, 19:36
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problema para evitar apilamientos de registro de eventos

La diferencia básica entre setInterval y setTimeout, es que el primer método ejecuta N veces una función cada X milésimas de segundo, mientras que el segundo método, ejecuta una y solo una vez la función luego de X milésimas de segundo. Prueba haciendo ese cambio de método.

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
  #5 (permalink)  
Antiguo 27/05/2014, 19:57
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Problema para evitar apilamientos de registro de eventos

Gracias @ocp001a y @Alexis88 por su sugerencia, no se si soy irremediablemente torpe en JS pero no logro me funcione, de hecho... ahora tengo un nuevo problema y es que se pierde el valor de la variable i entre invocacion e invocacion y entonces el contar no avanza... y creo me falta crear un closure para mantenerlo

Sera que me iluminan con su conocimiento del lenguaje ?

Código Javascript:
Ver original
  1. <html>
  2. <head>
  3. <title>No molestar!</title>
  4. <style>
  5.     body {background-color: #000;} 
  6.    
  7.     h1 {color: white;}
  8.  
  9.    #moverDiv
  10.    {
  11.         width:350px;
  12.         height:350px;
  13.         background-image: url("images/caminante.jpg");
  14.         border: red 2px;
  15.         position:relative;
  16.    }
  17. </style>
  18. </head>
  19. <body>
  20. <h1> No me molestes </h1>
  21.  
  22. <div id = "moverDiv"></div>
  23.  
  24. <script>
  25.     // @author: Pablo Bozzolo
  26.    
  27.     function moveMeHor(elem,cant,smooth)
  28.     {
  29.         smooth = smooth || false;
  30.        
  31.         console.log('In');
  32.        
  33.         //elem.removeEventListener('mouseover',miHandler,false);
  34.        
  35.         if (!smooth){
  36.             elem.style.left = cant;
  37.             return;
  38.         }  
  39.    
  40.         (function(){                       
  41.             i = 0;
  42.             inter = setTimeout(function()
  43.             {  
  44.                 console.log(i);
  45.                 if (i>cant)
  46.                 {                  
  47.                     i=0;
  48.                 }          
  49.            
  50.                 if (i==cant)
  51.                 {
  52.                     //clearTimeout(inter);
  53.                     //div.addEventListener ('mouseover',miHandler,false);                  
  54.                 }              
  55.                 elem.style.left = i;
  56.                 i++;
  57.                
  58.             },1);
  59.         })();  
  60.        
  61.        
  62.     }
  63.    
  64.     window.onload = function()
  65.     {  
  66.         div = document.getElementById('moverDiv'); 
  67.  
  68.         miHandler = function(){moveMeHor(div,500,true);};  
  69.         miHandler2 = function(){console.log('removiendo handler1'); div.removeEventListener('mouseover',miHandler,false);};
  70.            
  71.         // espero un tiempito segundo antes de registrar el mouseover  
  72.         setTimeout(function(){
  73.             div.addEventListener ('mouseover',miHandler,false);
  74.             //div.addEventListener ('mouseout',miHandler2,false);
  75.         },500);
  76.     }
  77.        
  78. </script>
  79. </body>
  80. </html>
__________________
Salu2!
  #6 (permalink)  
Antiguo 28/05/2014, 02:13
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problema para evitar apilamientos de registro de eventos

Sospecho que buscas hacer algo como esto:



Lo que hice fue declarar el contador por fuera de la función y dentro de ella aumentarla, así aíslo su valor y por ende, el elemento se desplaza.

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; 28/05/2014 a las 02:43 Razón: Mejora
  #7 (permalink)  
Antiguo 28/05/2014, 07:19
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Problema para evitar apilamientos de registro de eventos

@Alexis88 : gracias sobre todo por haberte puesto a ver esto a tan altas horas de la madrugada

Si te fijas se sigue acelerando pues se siguen disparando eventos y estos llamando a nuevas instancias de la funcion que mueve al div


Cita:
Lo que hice fue declarar el contador por fuera de la función y dentro de ella aumentarla, así aíslo su valor y por ende, el elemento se desplaza.
Lo mismo hice yo y de hecho al usar setInterval() con una funcion anonima se termina formando un "closure" que hace que el valor de i se conserve dentro de esa funcion interna y se pueda incrementar con cada nueva llamada por ser la implementacion de setInterval() de tipo recursiva.

Por eso.. la sugerencia de setTiemeout() hace que las cosas se compliquen en el sentido de que ahora toca armar otra vez un closure para resolver el hecho de que no hay recursividad en su implementacion.

Veo tampoco lo hiciste con setTiemeout() y me gustaria saber si lograas superar el "escollo" y aprender de la solucion.
__________________
Salu2!

Última edición por Italico76; 28/05/2014 a las 07:27
  #8 (permalink)  
Antiguo 28/05/2014, 10:14
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problema para evitar apilamientos de registro de eventos

Creo haber hallado la solución:



Lo que hice fue tomar el valor de la propiedad left del elemento y como en la función la hago aumentar de 100px en 100px, verifico que dicho sea divisible entre 100 o sea igual a 0, lo cual quiere decir que la función ha terminado de ejecutarse o que no se ha ejecutado aún, recién en ese momento se aplicará la función, evitando así la creación de una cola.

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; 28/05/2014 a las 10:42 Razón: Mejora
  #9 (permalink)  
Antiguo 28/05/2014, 10:33
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Problema para evitar apilamientos de registro de eventos

Gracias @Alexis88 ... lo voy a mirar...gracias!!!!!!!
__________________
Salu2!

Etiquetas: eventos, funcion, html, registro
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 18:38.