Le navigateur garder une trace des ID de minuterie active?
-
26-09-2019 - |
Question
Le navigateur garder une trace des ID setInterval
et setTimeout
actifs? Ou est-ce uniquement au développeur de garder une trace de?
Si elle garde la trace d'eux, est accessible via la nomenclature?
La solution
Il est pour le développeur de garder la trace. Vous pouvez le faire en utilisant la valeur renvoyée de la fonction setTimeout / setInterval et passer cette valeur à la fonction clearTimeout / clearInterval -. Comme décrit dans d'autres réponses ici
Cela semble être parce que chaque navigateur mettra en œuvre le suivi des intervalles à leur manière.
De w3.org/TR/2009/WD-html5-20090212/no.html (un projet, mais W3Schools et
Autres conseils
Vous pouvez ajouter ces minuteries globaux de suivi en remplaçant les fonctions setTimeout
/ seInterval
. En bonus, vous ajoutez facilement le code lorsqu'une minuterie est réglée ou sauté, le suivi en direct des minuteries ou des minuteries, etc ... éclatés
Par exemple:
timers = {}; // pending timers will be in this variable
originalSetTimeout = window.setTimeout;
// override `setTimeout` with a function that keeps track of all timers
window.setTimeout = function(fu, t) {
var id = originalSetTimeout(function() {
console.log(id+" has timed out");
delete timers[id]; // do not track popped timers
fu();
}, t);
// track this timer in the `timers` variable
timers[id] = {id:id, setAt: new Date(), timeout: t};
console.log(id+" has been set to pop in "+t+"ms");
}
// from this point onward all uses of setTimeout will be tracked, logged to console and pending timers will be kept in the global variable "timers".
Cela peut vous intéresse, si vous êtes curieux de savoir comment la minuterie est « rappeler » par sa fenêtre.
<!doctype html>
<html lang= "en">
<head>
<meta charset= "utf-8">
<title>Timer </title>
</head>
<body>
<h1>Timers</h1>
<script>
if(!window.timers){
var timers= [], i= 0;
while(i<5){
timers.push(setInterval(function(){
if(confirm(timers.join('\n')+'\nRemove a timer?')){
clearInterval(timers.shift());
}
},
i*1000+1000));
++i;
}
}
</script>
</body>
</html>
Mise à jour:
Il y a 2 aspects à cette question.
- Le navigateur garder une trace des ID de minuterie?
- Sont-ils accessibles
Je ne peux présumer de # 1 (et plus tard # 2) que l'OP signifie « sont-ils suivis » au sens général parce qu'en tant que développeur il / elle souhaite contrôler.
En bref, oui, ils sont suivis (comme @s_hewitt a noté, en tant que valeurs long
par le navigateur) et ils peuvent être gérés par le développeur en maintenant une référence aux minuteries lors de l'installation.
En tant que développeur vous pouvez contrôler (par exemple, arrêt) en appelant au ( clearInterval (HandleRef ) ou clearTimeout (HandleRef) )
Cependant, il n'y a pas window.timers
par défaut ou d'une collection similaire qui vous donne une liste des compteurs existants - vous aurez besoin de maintenir vous-même si vous sentez que vous devez
function startPolling(delay){
pollHandle = setInterval(doThis, delay);
}
function stopPolling(){
clearInterval(pollHandle);
}
function doThisIn30minUnlessStopped(){
timerHandle = setTimeout(doThisThing, 1800000);
}
function stop30minTimer(){
clearTimeout(timerHandle);
}
Il vous suffit de créer une référence variable à votre minuterie, et si / si nécessaire, clairement par son nom.
Lorsque vous chargez une autre page, tous les compteurs sont automatiquement effacés par le navigateur afin que vous n'avez pas besoin de maintenir une poignée, et les effacer à moins que vous devez / voulez.
Regardez les scripts ci-dessous, le navigateur pouvait se rappeler l'identifiant de chaque itération setTimeout
for (i = 1; i <= d; i++) {
(function(j) {
var delay = j/d;
t[j] = setTimeout(function() {
elem.style.top = j+"px";
},delay);
})(i);
}
Vous pouvez y accéder par
for (i in t) {
alert(t[i]);
}