Thay vì chỉ có một bộ đếm thời gian, đây là một triển khai lưu trữ tất cả các dòng thời gian vào một mảng. Nó chỉ hiển thị bộ hẹn giờ hoạt động trong khi câu trả lời được chấp nhận chỉ tính các cuộc gọi đến 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));
Đây là cách bạn có thể nhận được số lượng bộ hẹn giờ hoạt động trên trang:
timers.length;
Đây là cách bạn có thể xóa tất cả các bộ hẹn giờ đang hoạt động :
for(var i = timers.length; i--;)
clearInterval(timers[i]);
Các hạn chế đã biết:
- Bạn chỉ có thể chuyển một hàm (không phải một chuỗi) đến
setTimeout
với bản vá khỉ này.
- Hàm giả định
clearInterval
và clearTimeout
thực hiện tương tự, điều này họ làm nhưng nó có thể thay đổi trong tương lai.
activeTimers
phải giảm giá trị khiclearTimeout
được không gọi. Đó là dễ dàng thực hiện bằng cách thay thế dòng thứ hai củawindow.setTimeout
với điều này:return window.originalSetTimeout(function() {func(); activeTimers--;},delay);