18

setIntervalブラウザはアクティブIDとIDを追跡しsetTimeoutますか?それとも、これは開発者が追跡するだけですか?

それらを追跡している場合、BOMを介してアクセスできますか?

4

5 に答える 5

4

setTimeout/seInterval関数をオーバーライドすることで、このようなグローバル タイマー トラッキングを追加できます。おまけとして、タイマーが設定またはポップされたときにコードを簡単に追加したり、ライブタイマーやポップされたタイマーを追跡したりできます...

例えば:

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".
于 2012-10-28T13:23:25.607 に答える
4

追跡するのは開発者次第です。setTimeout/setInterval 関数の戻り値を使用し、その値を clearTimeout/clearInterval 関数に渡すことでこれを行うことができます - ここで他の回答で説明されているように。

これは、各ブラウザーが独自の方法で間隔の追跡を実装しているためと思われます。

w3.org/TR/2009/WD-html5-20090212/no.html から (ドラフトですが、w3schools とhttp://w3.org/TR/Windowはほぼ同じように説明しています) - setTimeout と setInterval は long を返しますおよび clearTimeout/clearInterval を検索してキャンセルするために long を受け入れます

于 2010-05-12T15:48:14.533 に答える
1

タイマーがそのウィンドウによってどのように「記憶」されるかについて興味がある場合、これは興味深いかもしれません。

<!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> 
于 2010-05-11T23:59:46.073 に答える
0

以下のスクリプトを見てください。ブラウザは各 setTimeout 反復の ID を記憶できます。

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

            })(i);           
 } 

あなたはそれらにアクセスすることができます

for (i in t) {
      alert(t[i]);  
 }
于 2010-05-12T15:41:10.323 に答える
0

アップデート:

この質問には 2 つの側面があります。

  1. ブラウザはタイマー ID を追跡しますか?
  2. それらはアクセス可能ですか

#1(およびその後の#2)については、OPは一般的な意味で「追跡されている」ことを意味していると推測できます。開発者として、それらを制御したいからです。

要するに、はい、それらは追跡され(@ s_hewittが指摘したようにlong、ブラウザによる値として)、セットアップ時にタイマーへの参照を維持することにより、開発者が管理できます。

開発者は、( clearInterval(handleRef)またはclearTimeout(handleRef) )を呼び出して制御 (停止など) できます。

ただし、既存のタイマーのリストを提供するデフォルトwindow.timersまたは同様のコレクションはありません。必要に応じて、自分でそれを維持する必要があります。

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

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

タイマーへの変数参照を作成し、必要に応じて名前でクリアするだけです。

別のページをロードすると、すべてのタイマーがブラウザによって自動的にクリアされるため、ハンドルを維持する必要はなく、必要または望まない限りクリアします。

于 2010-05-11T23:13:39.483 に答える