2009-12-02 10 views
90

¿Cómo puedo detener e iniciar setInterval?Cómo detener "setInterval"

Supongamos que tengo un textarea. Quiero detener setInterval en foco y reiniciar setInterval en desenfoque (con jQuery).

+0

Tienes un ejemplo en: [enter Descripción enlace aquí] [1] [1]: http://stackoverflow.com/questions/7483525/pausing-setinterval-when-page-browser-is-out-of-focus –

+11

Sólo se necesita un clic del ratón para aceptar una respuesta. Ayuda a los demás a ver una respuesta correcta entre muchas respuestas. HAGA CLIC – Onimusha

Respuesta

151

usted tiene que almacenar el id temporizador del intervalo cuando se inicia, que va a utilizar este valor después de detenerlo, utilizando la función clearInterval:

$(function() { 
    var timerId = 0; 

    $('textarea').focus(function() { 
    timerId = setInterval(function() { 
     // interval function body 
    }, 1000); 
    }); 

    $('textarea').blur(function() { 
    clearInterval(timerId); 
    }); 

}); 
+5

Sugeriría agregar un 'if (timerId) clearInteral (timerId)' antes de 'timerId = setInterval' - de lo contrario, no se garantiza que el intervalo se borre si se llama el enfoque con más frecuencia que el desenfoque. al probar esto, vi esta situación varias veces (en IE10). –

+0

@PatrickKlug ¡tienes razón! Necesitaba 'if (timerId) clearInteral (timerId)' también – bobbyrne01

18

tienda el regreso de setInterval en una variable, y úsala más tarde para borrar el intervalo.

var timer = null; 
$("textarea").blur(function(){ 
    timer = window.setInterval(function(){ ... whatever ... }, 2000); 
}).focus(function(){ 
    if(timer){ 
     window.clearInterval(timer); 
     timer = null 
    } 
}); 
10

setInterval devuelve un identificador que se puede utilizar para cancelar el intervalo con clearInterval()

+0

, pero ¿cómo puedo implementar esto con $ .live o $ .listen – testkhan

+1

'$ .live' actualmente no admite los eventos' focus' y 'blur'. –

22

Esto se basa en la respuesta de CMS. La pregunta planteada a que el temporizador se reiniciará en la falta de definición y se detuvo en el centro, por lo que lo movió un poco:

$(function() { 
    var timerId = 0; 

    $('textarea').focus(function() { 
    clearInterval(timerId); 
    }); 

    $('textarea').blur(function() { 
    timerId = setInterval(function() { 
    //some code here 
    }, 1000); 
    }); 
});