Alih-alih hanya menghitung timer, berikut adalah implementasi yang menyimpan semua timerid ke dalam array. Ini hanya menunjukkan timer aktif sedangkan jawaban yang diterima hanya menghitung panggilan ke 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));
Ini adalah bagaimana Anda bisa mendapatkan jumlah timer aktif di halaman:
timers.length;
Inilah cara Anda dapat menghapus semua timer aktif :
for(var i = timers.length; i--;)
clearInterval(timers[i]);
Batasan yang diketahui:
- Anda hanya bisa meneruskan fungsi (bukan string) ke
setTimeout
dengan patch monyet ini.
- Fungsi mengasumsikan
clearInterval
dan clearTimeout
melakukan hal yang sama, yang mereka lakukan tetapi dapat berubah di masa mendatang.
activeTimers
untuk pengurangan ketikaclearTimeout
itu tidak disebut. Itu mudah dicapai dengan mengganti baris keduawindow.setTimeout
dengan ini:return window.originalSetTimeout(function() {func(); activeTimers--;},delay);