इसके बजाय बस टाइमर की एक गिनती है, यहाँ एक कार्यान्वयन है जो सभी टाइमर की एक सरणी में संग्रहीत करता है। यह केवल सक्रिय टाइमर दिखाता है, जबकि स्वीकृत उत्तर केवल 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.setTimeoutreturn window.originalSetTimeout(function() {func(); activeTimers--;},delay);