इसके बजाय बस टाइमर की एक गिनती है, यहाँ एक कार्यान्वयन है जो सभी टाइमर की एक सरणी में संग्रहीत करता है। यह केवल सक्रिय टाइमर दिखाता है, जबकि स्वीकृत उत्तर केवल 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));
यह आप पृष्ठ पर सक्रिय टाइमर की गिनती प्राप्त कर सकते हैं :
timers.length;
यह है कि आप सभी सक्रिय टाइमर कैसे निकाल सकते हैं :
for(var i = timers.length; i--;)
clearInterval(timers[i]);
ज्ञात सीमाएँ:
- आप केवल
setTimeout
इस बंदर के पैच के साथ एक फ़ंक्शन (स्ट्रिंग नहीं) पारित कर सकते हैं ।
- फ़ंक्शन मानता है
clearInterval
और clearTimeout
वही करता है, जो वे करते हैं लेकिन यह भविष्य में बदल सकता है।
activeTimers
जब मुझे बुलाया नहींclearTimeout
गया था, तो मुझे इसे कम करने की आवश्यकता थी । इस के साथ दूसरी पंक्ति के स्थान पर इसे आसानी से पूरा किया जाता है :window.setTimeout
return window.originalSetTimeout(function() {func(); activeTimers--;},delay);