7

指定された秒数後にすべての JS setTimeout 、 setInterval 、および requestAnimationFrame をキャンセルする適切な方法は何ですか?

編集:すみません、もっと説明すべきでした!コードはデータベースまたは一部の API から取得されるため、タイムアウト、raf、または間隔 ID を追跡できません。そのため、簡単に clearInterval または clearTimeout または cancelAnimationFrame を実行できるタイマーの ID がありません。それらを使用する必要があることはわかっていますが、すべてのアニメーション ID (存在する場合) を取得する方法がわかりません。

4

2 に答える 2

14

作成した各間隔、タイムアウト、および requestAnimationFrame の ID を保持し、window.clearInterval(id)それらを呼び出す必要があります。

それを行うためのverfyハック/ブルートフォースの方法は次のようになります:

for (var i = 1; i < 99999; i++) {
    window.clearInterval(i);
    window.clearTimeout(i);
    window.mozCancelAnimationFrame(i); // Firefox
}

しかし、私はそれをお勧めしません。

アップデート:

一定時間後にそれを行うには:

setTimeout(function () {
   for (var i = 1; i < 99999; i++) {
        window.clearInterval(i);
        window.clearTimeout(i);
        window.mozCancelAnimationFrame(i); // Firefox
    }
}, 3000); // After 3 seconds

更新 2:

タイムアウトなどのたびに参照を保持しない場合、ブルートフォースの方法よりも良い方法があるとは思わないので、それを少し簡単にするために(このSOの回答で示唆されているように)、次のことができますデフォルトの setInterval をオーバーライドします。

var intervals = new Array();
window.oldSetInterval = window.setInterval;
window.setInterval = function(func, interval) {
    intervals.push(oldSetInterval(func, interval));
}

// Now you can loop over intervals and clear them 
// one by one when ever you want to.

for (var interval in intervals) {
   window.clearInterval(interval);
}

この例では、 に対してそれを行う方法を示していますsetIntervalが、もちろん、 に対しても同じ方法で行うことができsetTimeoutますrequestAnimationFrame

于 2012-07-07T10:20:46.697 に答える
1

各タイムアウト (の戻り値setTimeout)への参照を取得してから使用する必要がありclearTimeout()ます。setInterval についても同様です。

于 2012-07-07T10:22:57.600 に答える