En lugar de solo tener un conteo de temporizadores, aquí hay una implementación que almacena todos los identificadores de temporizador en una matriz. Solo muestra temporizadores activos mientras que la respuesta aceptada solo cuenta las llamadas a 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));
Así es como puede obtener el recuento de temporizadores activos en la página:
timers.length;
Así es como puede eliminar todos los temporizadores activos :
for(var i = timers.length; i--;)
clearInterval(timers[i]);
Limitaciones conocidas:
- Solo puede pasar una función (no una cadena)
setTimeout
con este parche de mono.
- La función asume
clearInterval
y clearTimeout
hace lo mismo, lo que hacen pero podría cambiar en el futuro.
activeTimers
a disminuir cuandoclearTimeout
se no se llama. Eso se logra fácilmente reemplazando la segunda línea dewindow.setTimeout
con esto:return window.originalSetTimeout(function() {func(); activeTimers--;},delay);