2009-12-02 1 views
90

Come posso interrompere e avviare setInterval?Come interrompere "setInterval"

Supponiamo di avere un textarea. Voglio interrompere setInterval sullo stato attivo e riavviare setInterval in sfocatura (con jQuery).

+0

Hai un esempio in: [inserire descrizione collegamento qui] [1] [1]: http://stackoverflow.com/questions/7483525/pausing-setinterval-when-page-browser-is-out-of-focus –

+11

Ci vuole un solo clic del mouse per accettare una risposta. Aiuta anche gli altri a vedere una risposta corretta tra molte risposte. CLIC – Onimusha

risposta

151

è necessario memorizzare l'id temporizzatore dell'intervallo quando si avvia, si utilizzerà questo valore in seguito per fermarlo, usando la funzione clearInterval:

$(function() { 
    var timerId = 0; 

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

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

}); 
+5

Suggerirei di aggiungere un 'if (timerId) clearInteral (timerId)' prima di 'timerId = setInterval' - altrimenti, non è garantito che l'intervallo venga cancellato se lo stato attivo viene chiamato più spesso della sfocatura. durante il test ho visto questa situazione alcune volte (su IE10). –

+0

@PatrickKlug your right! Avevo bisogno di 'if (timerId) clearInteral (timerId)' anche – bobbyrne01

18

Conservare il ritorno di setInterval in un variabile, e usarlo in seguito per cancellare l'intervallo.

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

setInterval restituisce un id che è possibile utilizzare per annullare l'intervallo con clearInterval()

+0

ma come posso implementarlo con $ .live o $ .listen – testkhan

+1

'$ .live' attualmente non supporta gli eventi' focus' e 'blur'. –

22

Questo si basa sulla risposta di CMS. La domanda posta per il timer per essere riavviato sulla sfocatura e si fermò sulla messa a fuoco, quindi ho spostato un po 'intorno:

$(function() { 
    var timerId = 0; 

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

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