18 Stimmen

Verfolgt der Browser die aktiven Timer-IDs?

Behält der Browser den Überblick über aktive setInterval y setTimeout IDs? Oder ist es allein Sache des Entwicklers, den Überblick zu behalten?

Wenn ja, ist sie über die Stückliste zugänglich?

2 Stimmen

Auch darauf hätte ich gerne eine gute Antwort; ich glaube, sie lautet "nein", aber ich habe das nie wirklich recherchiert.

1 Stimmen

Und selbst wenn sie irgendwie registriert würden, woher wüssten Sie, wer welcher ist? Nun, ich denke, wenn Sie wissen, dass es nur eine Zeitüberschreitung oder ein Intervall oder was auch immer gibt, brauchen Sie das nicht zu wissen.

0 Stimmen

Haha, du hast "BOM" statt DOM gesagt.

4voto

s_hewitt Punkte 4172

Es ist Sache des Entwicklers, den Überblick zu behalten. Sie können dies tun, indem Sie den von der Funktion setTimeout/setInterval zurückgegebenen Wert verwenden und diesen Wert an die Funktion clearTimeout/clearInterval übergeben - wie in anderen Antworten hier beschrieben.

Dies scheint daran zu liegen, dass jeder Browser die Verfolgung der Intervalle auf seine eigene Weise umsetzt.

Von w3.org/TR/2009/WD-html5-20090212/no.html (ein Entwurf, aber w3schools und http://w3.org/TR/Window erklären es fast genauso) - setTimeout und setInterval geben einen long zurück und clearTimeout/clearInterval akzeptieren einen long zum Suchen und Abbrechen

4voto

Iftah Punkte 9298

Sie können solche globalen Zeitgeber zur Verfolgung hinzufügen, indem Sie die setTimeout / seInterval Funktionen. Als Bonus können Sie ganz einfach Code hinzufügen, wenn ein Timer gesetzt oder ausgelöst wird, Live-Timer oder ausgelöste Timer verfolgen, usw...

Zum Beispiel:

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".

1voto

kennebec Punkte 98551

Das könnte Sie interessieren, wenn Sie wissen wollen, wie der Timer von seinem Fenster "gemerkt" wird.

<!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>

0voto

scunliffe Punkte 60080

Aktualisierung:

Zu dieser Frage gibt es 2 Aspekte.

  1. Behält der Browser die Timer-IDs im Auge?
  2. Sind sie zugänglich

Bei Nr. 1 (und später bei Nr. 2) kann ich nur vermuten, dass der Auftraggeber "werden sie verfolgt" im allgemeinen Sinne meint, weil er als Entwickler die Kontrolle über sie haben möchte.

Kurz gesagt, ja, sie werden nachverfolgt (wie @s_hewitt bemerkte, als long Werte des Browsers) und sie können vom Entwickler verwaltet werden, indem er bei der Einrichtung einen Verweis auf die Zeitgeber beibehält.

Als Entwickler können Sie diese kontrollieren (z.B. stoppen), indem Sie ( clearInterval(handleRef) , oder clearTimeout(handleRef) )

Es gibt jedoch keinen Standard window.timers oder eine ähnliche Sammlung, die Ihnen eine Liste der vorhandenen Zeitschaltuhren liefert - diese müssen Sie selbst pflegen, wenn Sie dies für nötig halten.

function startPolling(delay){
  pollHandle = setInterval(doThis, delay);
}
function stopPolling(){
  clearInterval(pollHandle);
}

function doThisIn30minUnlessStopped(){
  timerHandle = setTimeout(doThisThing, 1800000);
}
function stop30minTimer(){
  clearTimeout(timerHandle);
}    

Sie müssen lediglich einen Variablenverweis auf Ihre Zeitschaltuhr erstellen und sie bei Bedarf mit ihrem Namen löschen.

Wenn Sie eine andere Seite laden, werden alle Timer automatisch vom Browser gelöscht, so dass Sie sich nicht mehr darum kümmern müssen, sie zu löschen, es sei denn, Sie wollen oder müssen es.

0voto

unigg Punkte 460

Sehen Sie sich die folgenden Skripte an, der Browser könnte sich die ID jeder setTimeout-Iteration merken

for (i = 1; i <= d; i++) {
          (function(j) {
                var delay = j/d; 
               t[j] = setTimeout(function() {      
                      elem.style.top = j+"px";
                     },delay);

            })(i);           
 } 

Sie können sie aufrufen über

for (i in t) {
      alert(t[i]);  
 }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X