En lugar de simplemente tener un recuento de los temporizadores, aquí es una aplicación que almacena todos de timerId 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));
Esto es cómo se puede obtener el recuento de los temporizadores activos en la página:
timers.length;
Así es como se 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) a
setTimeout
con este parche de mono.
- La función asume que
clearInterval
y clearTimeout
hacen lo mismo, lo cual hacen, pero podría cambiar en el futuro.
Tenga en cuenta que la línea 2 tiene un error tipográfico. window.cleartTimeout debe ser window.clearTimeout. SO no me permitirá editarlo sin cambiar al menos 6 caracteres. – checker
bien visto, ¡pasó 3 años antes de que alguien lo notara! –
Lo usé en algún código hoy, pero necesitaba 'activeTimers' para disminuir cuando' clearTimeout' era * no * llamado. Esto se logra fácilmente reemplazando la segunda línea de 'window.setTimeout' con esto:' return window.originalSetTimeout (function() {func(); activeTimers -;}, delay); ' –