Sadece bir zamanlayıcı sayısına sahip olmak yerine, burada tüm timerid'leri bir dizide saklayan bir uygulama var. Yalnızca aktif zamanlayıcıları gösterirken, kabul edilen cevap yalnızca setTimeout
& ile yapılan aramaları sayar 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));
Sayfadaki etkin zamanlayıcıların sayısını şu şekilde alabilirsiniz :
timers.length;
Tüm aktif zamanlayıcıları şu şekilde kaldırabilirsiniz :
for(var i = timers.length; i--;)
clearInterval(timers[i]);
Bilinen sınırlamalar:
setTimeout
Bu maymun yamasıyla yalnızca bir işlevi (bir dizge değil) geçirebilirsiniz .
- İşlev varsayar
clearInterval
ve clearTimeout
aynısını yapar, bunu yapar, ancak gelecekte değişebilir.
activeTimers
olduğunda azaltmaclearTimeout
edildi değildir denir. Bu, ikinci satırıwindow.setTimeout
bununla değiştirerek kolayca başarılabilir :return window.originalSetTimeout(function() {func(); activeTimers--;},delay);