setInterval
ブラウザはアクティブIDとIDを追跡しsetTimeout
ますか?それとも、これは開発者が追跡するだけですか?
それらを追跡している場合、BOMを介してアクセスできますか?
setInterval
ブラウザはアクティブIDとIDを追跡しsetTimeout
ますか?それとも、これは開発者が追跡するだけですか?
それらを追跡している場合、BOMを介してアクセスできますか?
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".
追跡するのは開発者次第です。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 を受け入れます
タイマーがそのウィンドウによってどのように「記憶」されるかについて興味がある場合、これは興味深いかもしれません。
<!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>
以下のスクリプトを見てください。ブラウザは各 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]);
}
アップデート:
この質問には 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);
}
タイマーへの変数参照を作成し、必要に応じて名前でクリアするだけです。
別のページをロードすると、すべてのタイマーがブラウザによって自動的にクリアされるため、ハンドルを維持する必要はなく、必要または望まない限りクリアします。