2009-12-02 6 views
90

Comment arrêter et démarrer setInterval?Comment arrêter "setInterval"

Supposons que j'ai un textarea. Je veux arrêter setInterval sur le focus et redémarrer setInterval sur le flou (avec jQuery).

+0

Vous avez un exemple dans: [enter description du lien ici] [1] [1]: http://stackoverflow.com/questions/7483525/pausing-setinterval-when-page-browser-is-out-of-focus –

+11

Il suffit d'un seul clic de souris pour accepter une réponse. Cela aide aussi les autres à voir une réponse correcte parmi de nombreuses réponses. CLIQUEZ – Onimusha

Répondre

151

Vous avez pour stocker l'ID de minuterie de l'intervalle lorsque vous démarrez, vous utiliserez cette valeur plus tard pour l'arrêter, en utilisant la fonction clearInterval:

$(function() { 
    var timerId = 0; 

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

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

}); 
+5

Je suggère d'ajouter un 'if (timerId) clearInteral (timerId)' avant 'timerId = setInterval' - sinon, il n'est pas garanti que l'intervalle est effacé si le focus est appelé plus souvent que le flou. lors du test, j'ai vu cette situation quelques fois (sur IE10). –

+0

@PatrickKlug votre droit! J'avais besoin de 'if (timerId) clearInteral (timerId)' aussi – bobbyrne01

18

magasin le retour de setInterval dans un variable, et l'utiliser plus tard pour effacer l'intervalle.

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

setInterval retourne un identifiant que vous pouvez utiliser pour annuler l'intervalle avec clearInterval()

+0

mais comment puis-je l'implémenter avec $ .live ou $ .listen – testkhan

+1

'$ .live' ne supporte pas actuellement les événements' focus' et 'blur'. –

22

Ceci est basé sur la réponse de la CMS. La question posée pour la minuterie de redémarrer sur le flou et arrêté sur la mise au point, donc je l'ai déplacé autour d'un petit:

$(function() { 
    var timerId = 0; 

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

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