Thay vì chỉ có một đếm giờ, đây là một thực hiện mà các cửa hàng tất cả của timerid vào một mảng. 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 số 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ể lấy số của giờ hoạt động trên trang:
timers.length;
Đây là cách bạn có thể loại bỏ tất cả các giờ hoạt động:
for(var i = timers.length; i--;)
clearInterval(timers[i]);
Các giới hạn đã biết:
- Bạn chỉ có thể chuyển một hàm (không phải là chuỗi) đến
setTimeout
với bản vá khỉ này.
- Hàm này giả định
clearInterval
và clearTimeout
cũng làm như vậy, nhưng chúng có thể thay đổi trong tương lai.
Lưu ý rằng Dòng 2 có lỗi đánh máy. window.cleartTimeout phải là window.clearTimeout. SO sẽ không cho phép tôi chỉnh sửa nó mà không thay đổi ít nhất 6 ký tự. – checker
cũng phát hiện, nó đã đi 3 năm trước khi bất cứ ai nhận thấy! –
Tôi đã sử dụng mã này trong một số mã ngày hôm nay, nhưng tôi cần 'activeTimers' để giảm khi' clearTimeout' được * không * gọi. Điều đó dễ dàng thực hiện bằng cách thay thế dòng thứ hai của 'window.setTimeout' bằng cách này:' return window.originalSetTimeout (function() {func(); activeTimers -;}, delay); ' –