2009-05-13 7 views

答えて

53

アクティブタイマーを列挙する方法はありませんが、window.setTimeoutとwindow.clearTimeoutをオーバーライドして、独自の実装で置き換えてトラッキングしてから元のものを呼び出すことができます。もちろん

window.originalSetTimeout=window.setTimeout; 
window.originalClearTimeout=window.clearTimeout; 
window.activeTimers=0; 

window.setTimeout=function(func,delay) 
{ 
    window.activeTimers++; 
    return window.originalSetTimeout(func,delay); 
}; 

window.clearTimeout=function(timerID) 
{ 
    window.activeTimers--; 
    window.originalClearTimeout(timerID); 
}; 

、あなたは常にてclearTimeoutを呼び出さないかもしれないが、これは、少なくともあなたの実行時に何が起こっているかを追跡するためのいくつかの方法を与えるだろう。

+5

2行目にタイプミスがあることに注意してください。 window.cleartTimeoutはwindow.clearTimeoutでなければなりません。少なくとも6文字は変更せずに編集することはできません。 – checker

+7

はよく目撃され、3年前に誰かが気付いた! –

+3

今日はこれをいくつかのコードで使っていましたが、 'clearTimeout'が呼び出されなかったときに' activeTimers'を減らす必要がありました。 'window.originalSetTimeout(function(){func(); activeTimers - ;}、delay);' –

11

PaulがsetTimeoutだけをカバーしているのを見て、setInterval/clearIntervalのカウンタを共有すると思っていました。

window.originalSetInterval = window.setInterval; 
window.originalClearInterval = window.clearInterval; 
window.activeIntervals = 0; 
window.setInterval = function (func, delay) 
{ 
    if(func && delay){ 
      window.activeIntervals++; 
    } 
    return window.originalSetInterval(func,delay); 
}; 
window.clearInterval = function (intervalId) 
{ 
    // JQuery sometimes hands in true which doesn't count 
    if(intervalId !== true){ 
     window.activeIntervals--; 
    } 
    return window.originalClearInterval(intervalId); 
}; 
24

すべての間隔を示すChrome DevTools拡張機能を作成しました。クリアされたものはグレー表示されます。

Timers Chrome Devtool extension

setInterval-sniffer

+5

悲しいことに、これはChromeでの使用が停止したように見えます。 –

6

だけではなくタイマーのカウントを持って、ここでは配列にすべてtimerIdの年代を保存する実装があります。 アクティブタイマーのみを表示し、受け入れられた回答はsetTimeout & clearTimeoutへのコールをカウントします。

(function(w) { 
    var oldST = w.setTimeout; 
    var oldSI = w.setInterval; 
    var oldCI = w.clearInterval; 
    var timers = []; 
    w.timers = timers; 
    w.setTimeout = function(fn, delay) { 
     var id = oldST(function() { 
      fn && fn(); 
      removeTimer(id); 
     }, delay); 
     timers.push(id); 
     return id; 
    }; 
    w.setInterval = function(fn, delay) { 
     var id = oldSI(fn, delay); 
     timers.push(id); 
     return id; 
    }; 
    w.clearInterval = function(id) { 
     oldCI(id); 
     removeTimer(id); 
    }; 
    w.clearTimeout = w.clearInterval; 

    function removeTimer(id) { 
     var index = timers.indexOf(id); 
     if (index >= 0) 
      timers.splice(index, 1); 
    } 
}(window)); 

これは、ページ上のアクティブなタイマーの数を得ることができる方法である。

timers.length; 

これは、あなたがすべてのアクティブなタイマー削除する方法です。

for(var i = timers.length; i--;) 
    clearInterval(timers[i]); 

を既知の制限:

  • このサルのパッチでは、文字列でない関数をsetTimeoutに渡すことしかできません。
  • この関数は、clearIntervalclearTimeoutが同じ働きをすることを前提としていますが、将来は変更される可能性があります。
+0

実行中のすべてのSetIntervalsの名前を取得できますか?たとえば 'var timer = setInterval(function(){}'実行間隔のカウントの代わりに* timer *が必要です。 –

2

この正確な問題を解決するパッケージはpublishedです。それと

npm install time-events-manager 

、あなたは(intervalCollectionオブジェクトを介してとJavaScriptの間隔)timeoutCollectionオブジェクトを介してそれらを表示および管理することができます。

0

私はちょうどこのような何かを必要とし、これは私がまとめたものである:

window.setInterval = function (window, setInterval) { 
    if (!window.timers) { 
     window.timers = {}; 
    } 
    if (!window.timers.intervals) { 
     window.timers.intervals = {}; 
    } 
    if (!window.timers.intervals.active) { 
     window.timers.intervals.active = {}; 
    } 
    return function (func, interval) { 
     var id = setInterval(func, interval); 
     window.timers.intervals.active[id] = func; 
     return id; 
    } 
}(window, window.setInterval); 

window.clearInterval = function (window, clearInterval) { 
    if (!window.timers) { 
     window.timers = {}; 
    } 
    if (!window.timers.intervals) { 
     window.timers.intervals = {}; 
    } 
    if (!window.timers.intervals.inactive) { 
     window.timers.intervals.inactive = {}; 
    } 
    return function (id) { 
     if (window.timers.intervals.active && window.timers.intervals.active[id]) { 
      window.timers.intervals.inactive[id] = window.timers.intervals.active[id]; 
      clearInterval(id); 
      delete window.timers.intervals.active[id]; 
     } 
    } 
}(window, window.clearInterval); 

これは、その機能と一緒に間隔のIDを記録し、またその状態(アクティブ/非アクティブ)を追跡します。

関連する問題