2010-04-12 33 views
7

Duplicar posibles:
javascript: pause setTimeout();¿Cómo pausar una llamada a setTimeout?

Im usando jQuery y trabajando en un sistema de notificación para mi sitio. Las notificaciones se difuminan automáticamente utilizando la función setTimeout.

¿Cómo puedo detener el temporizador de la llamada setTimeout?

Por ejemplo me gustaría hacer una pausa en la llamada setTimeout mientras que el ratón está sobre la notificación y seguir la cuenta atrás ... mouseout

Busqué en Google "pausa setTimeout" sin suerte.

Actualmente estoy borrando la llamada a setTimeout con clearTimeout y, al mismo tiempo, desvaneciendo la notificación en mouseout, pero sería bueno tener ese efecto de pausa.

¿Alguna idea?

+2

D ¿No tiene sentido, sin embargo, restablecer el temporizador cuando el mouse está sobre la notificación? Quiero decir, si el temporizador está en pausa a 1 milisegundo, entonces el usuario no tendrá más tiempo después de que salga el mouse – Bob

+0

Bueno, no expliqué todo el proceso, pero agrega tiempo dependiendo de la duración del mensaje. – Pablo

Respuesta

9

probar esto.

var myTimeOut; 
$(someElement).mouseout(function() { 
    myTimeOut = setTimeout("mytimeoutfunction()", 5000) 
}); 

$(someElement).mouseover(function() { 
    clearTimeout(myTimeOut); 
}); 
+0

Gracias por la respuesta, me gusta más esta solución. También agregaré un evento de clic para borrar todo y desvanecer el mensaje también. – Pablo

+0

wow. ¿Cuándo se convirtió SO en 'writemycodezforme'? – fig

+5

Fig, fue una cosa fácil de escribir. Claramente Pablo lo entendió y pudo usarlo, modificarlo y aplicar lo que aprendió. –

6

No sería demasiado difícil añadir una clase PausableTimeout:

(no podría ser JS válidos, pero no debería ser demasiado difícil para que funcione):

function PausableTimeout(func, millisec) { 
     this.func = func; 
     this.stTime = new Date().valueOf(); 
     this.timeout = setTimeout(func, millisec); 
     this.timeLeft = millisec; 
    } 
    function PausableTimer_pause() { 
     clearTimeout(self.timeout); 
     var timeRan = new Date().valueOf()-this.stTime; 
     this.timeLeft -= timeRan; 
    } 
    function PausableTimer_unpause() { 
     this.timeout = setTimeout(this.func, this.timeLeft); 
     this.stTime = new Date().valueOf(); 
    } 
    PausableTimer.prototype.pause = PausableTimer_pause; 
    PausableTimer.prototype.unpause = PausableTimer_unpause; 

    //Usage: 
    myTimer = new PausableTimer(function(){alert("It works!");}, 2000); 
    myTimer.pause(); 
    myTimer.unpause(); 

Por supuesto, sería una buena idea agregar algunas comprobaciones de errores allí (¡no quiero que sea posible cancelar el tiempo de espera varias veces y terminar con cientos de tiempos de espera!), Pero dejaré eso sea ​​su trabajo: P

Cuestiones relacionadas