Au lieu de simplement avoir un nombre de minuteries, voici une implémentation qui stocke tous les identificateurs de minuterie dans un tableau. Il n'affiche que les minuteries actives tandis que la réponse acceptée ne compte que les appels vers 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));
Voici comment obtenir le nombre de minuteries actives sur la page:
timers.length;
Voici comment supprimer tous les minuteurs actifs :
for(var i = timers.length; i--;)
clearInterval(timers[i]);
Limitations connues:
- Vous ne pouvez passer une fonction (pas une chaîne) à
setTimeoutavec ce patch de singe.
- La fonction suppose
clearIntervalet clearTimeoutfait la même chose, ce qu'elle fait, mais cela pourrait changer à l'avenir.
activeTimersde décrémenter quand ilclearTimeoutn'était pas appelé. C'est facilement accompli en remplaçant la deuxième ligne dewindow.setTimeoutpar ceci:return window.originalSetTimeout(function() {func(); activeTimers--;},delay);