क्या किसी दिए गए विंडो से सभी समय को खाली करने का एक तरीका है? मुझे लगता है कि टाइमआउट window
ऑब्जेक्ट में कहीं जमा हो जाते हैं, लेकिन इसकी पुष्टि नहीं कर सकते।
किसी भी क्रॉस ब्राउज़र समाधान का स्वागत है।
क्या किसी दिए गए विंडो से सभी समय को खाली करने का एक तरीका है? मुझे लगता है कि टाइमआउट window
ऑब्जेक्ट में कहीं जमा हो जाते हैं, लेकिन इसकी पुष्टि नहीं कर सकते।
किसी भी क्रॉस ब्राउज़र समाधान का स्वागत है।
जवाबों:
वे विंडो ऑब्जेक्ट में नहीं हैं, लेकिन उनके पास आईडी हैं, जो (afaik) लगातार पूर्णांक हैं।
तो आप इस तरह से सभी समय समाप्त कर सकते हैं:
var id = window.setTimeout(function() {}, 0);
while (id--) {
window.clearTimeout(id); // will do nothing if no timeout with id is present
}
मुझे लगता है कि इसे पूरा करने का सबसे आसान तरीका सभी setTimeout
पहचानकर्ताओं को एक सरणी में संग्रहीत करना होगा , जहां आप आसानी clearTimeout()
से उन सभी पर पुनरावृति कर सकते हैं ।
var timeouts = [];
timeouts.push(setTimeout(function(){alert(1);}, 200));
timeouts.push(setTimeout(function(){alert(2);}, 300));
timeouts.push(setTimeout(function(){alert(3);}, 400));
for (var i=0; i<timeouts.length; i++) {
clearTimeout(timeouts[i]);
}
मेरे पास Pumbaa80 के उत्तर के अतिरिक्त है जो पुराने IE के लिए विकसित करने वाले किसी व्यक्ति के लिए उपयोगी हो सकता है।
हां, सभी प्रमुख ब्राउज़र टाइमआउट आईडी को लगातार पूर्णांक के रूप में लागू करते हैं (जो विनिर्देश द्वारा आवश्यक नहीं है )। प्रारंभिक संख्या को अलग करके ब्राउज़र को ब्राउज़र में अलग करता है। ऐसा लगता है कि ओपेरा, सफारी, क्रोम और आईई> 8 1 से टाइमआउट आईडी शुरू करते हैं, 2 से जीको-आधारित ब्राउज़र और कुछ यादृच्छिक संख्या से आईई <= 8, जो कि टैब रीफ़्रेश होने पर जादुई रूप से सहेजे जाते हैं। आप इसे स्वयं खोज सकते हैं ।
वह सब जो आईई <= 8 में है, while (lastTimeoutId--)
चक्र 8digits बार चल सकता है और " इस पृष्ठ पर एक स्क्रिप्ट इंटरनेट एक्सप्लोरर को धीरे-धीरे चलाने " का संदेश दिखा रहा है । इसलिए यदि आप सभी समयबाह्य आईडी को नहीं बचा सकते हैं या window.setTimeout को ओवरराइड नहीं करना चाहते हैं, तो आप किसी पृष्ठ पर पहली टाइमआउट आईडी को सहेजने और समय समाप्त होने तक उस पर विचार कर सकते हैं।
प्रारंभिक पृष्ठ लोड पर कोड निष्पादित करें:
var clearAllTimeouts = (function () {
var noop = function () {},
firstId = window.setTimeout(noop, 0);
return function () {
var lastId = window.setTimeout(noop, 0);
console.log('Removing', lastId - firstId, 'timeout handlers');
while (firstId != lastId)
window.clearTimeout(++firstId);
};
});
और फिर सभी लंबित समयबाह्य को साफ़ करें जो संभवतः विदेशी कोड द्वारा निर्धारित किया गया था जो आप चाहते हैं
कैसे एक वैश्विक सरणी में टाइमआउट आईडी स्टोर करें, और विंडो में फ़ंक्शन कॉल को प्रतिनिधि करने के लिए एक विधि को परिभाषित करें।
GLOBAL={
timeouts : [],//global timeout id arrays
setTimeout : function(code,number){
this.timeouts.push(setTimeout(code,number));
},
clearAllTimeout :function(){
for (var i=0; i<this.timeouts.length; i++) {
window.clearTimeout(this.timeouts[i]); // clear all the timeouts
}
this.timeouts= [];//empty the id array
}
};
आपको window.setTimeout
विधि को फिर से लिखना होगा और इसकी टाइमआउट आईडी को सहेजना होगा।
const timeouts = [];
const originalTimeoutFn = window.setTimeout;
window.setTimeout = function(fun, delay) { //this is over-writing the original method
const t = originalTimeoutFn(fn, delay);
timeouts.push(t);
}
function clearTimeouts(){
while(timeouts.length){
clearTimeout(timeouts.pop();
}
}
नीचे दिए गए कोड को किसी अन्य स्क्रिप्ट से पहले रखें और यह मूल setTimeout
और के लिए एक आवरण फ़ंक्शन बनाएगा clearTimeout
।
ऑब्जेक्ट में एक नया clearTimeouts
तरीका जोड़ा जाएगा window
, जो सभी (लंबित) टाइमआउट्स ( Gist लिंक ) को क्लियर करने की अनुमति देगा ।
अन्य उत्तरों में संभावित तर्कों के लिए पूर्ण समर्थन का अभाव हो सकता है।
setTimeout
// isolated layer wrapper (for the local variables)
(function(_W){
var cache = [], // will store all timeouts IDs
_set = _W.setTimeout, // save original reference
_clear = _W.clearTimeout // save original reference
// Wrap original setTimeout with a function
_W.setTimeout = function( CB, duration, arg ){
// also, wrap the callback, so the cache reference will be removed
// when the timeout has reached (fired the callback)
var id = _set(function(){
CB.apply(null, arguments)
removeCacheItem(id)
}, duration || 0, arg)
cache.push( id ) // store reference in the cache array
// id reference must be returned to be able to clear it
return id
}
// Wrap original clearTimeout with a function
_W.clearTimeout = function( id ){
_clear(id)
removeCacheItem(id)
}
// Add a custom function named "clearTimeouts" to the "window" object
_W.clearTimeouts = function(){
console.log("Clearing " + cache.length + " timeouts")
cache.forEach(n => _clear(n))
cache.length = []
}
// removes a specific id from the cache array
function removeCacheItem( id ){
var idx = cache.indexOf(id)
if( idx > -1 )
cache = cache.filter(n => n != id )
}
})(window);
पूर्णता के लिए, मैं एक सामान्य समाधान पोस्ट करना चाहता था जो दोनों को कवर करता है setTimeout
और setInterval
।
ऐसा लगता है कि ब्राउज़र दोनों के लिए ID के एक ही पूल का उपयोग कर सकते हैं, लेकिन कुछ उत्तरों से लेकर ClearTimeout और ClearInterval समान हैं? , यह स्पष्ट नहीं है कि एक ही फ़ंक्शन पर भरोसा करना clearTimeout
और clearInterval
प्रदर्शन करना सुरक्षित है या केवल उनके संबंधित टाइमर प्रकारों पर काम करना।
इसलिए, जब लक्ष्य सभी टाइमआउट और अंतराल को मारना है, तो यहां एक कार्यान्वयन है जो उन सभी का परीक्षण करने में असमर्थ होने पर कार्यान्वयन में थोड़ा अधिक रक्षात्मक हो सकता है:
function clearAll(windowObject) {
var id = Math.max(
windowObject.setInterval(noop, 1000),
windowObject.setTimeout(noop, 1000)
);
while (id--) {
windowObject.clearTimeout(id);
windowObject.clearInterval(id);
}
function noop(){}
}
आप इसका उपयोग वर्तमान विंडो में सभी टाइमर साफ़ करने के लिए कर सकते हैं:
clearAll(window);
या आप इसे सभी टाइमर को खाली करने के लिए उपयोग कर सकते हैं iframe
:
clearAll(document.querySelector("iframe").contentWindow);
मैं टाइपस्क्रिप्ट के साथ Vue का उपयोग करता हूं।
private setTimeoutN;
private setTimeoutS = [];
public myTimeoutStart() {
this.myTimeoutStop();//stop All my timeouts
this.setTimeoutN = window.setTimeout( () => {
console.log('setTimeout');
}, 2000);
this.setTimeoutS.push(this.setTimeoutN)//add THIS timeout ID in array
}
public myTimeoutStop() {
if( this.setTimeoutS.length > 0 ) {
for (let id in this.setTimeoutS) {
console.log(this.setTimeoutS[id]);
clearTimeout(this.setTimeoutS[id]);
}
this.setTimeoutS = [];//clear IDs array
}
}
वैश्विक टाइमआउट का उपयोग करें, जो आपके सभी अन्य कार्यों से प्राप्त होता है। यह सब कुछ तेजी से चलाएगा, और प्रबंधन करने में आसान होगा, हालांकि यह आपके कोड में कुछ अमूर्त जोड़ देगा।
set_timeout
वैश्विक समारोह के व्यवहार का विस्तार करने का मतलब है ? क्या आप एक उदाहरण कोड दे सकते हैं?
हमने इस सटीक मुद्दे को हल करते हुए एक पैकेज प्रकाशित किया है।
npm install time-events-manager
कि के साथ, आप के माध्यम से सभी समय समाप्ति और अंतराल देख सकते हैं timeoutCollection
और intervalCollection
वस्तुओं। एक removeAll
फ़ंक्शन भी है जो संग्रह और ब्राउज़र दोनों से सभी टाइमआउट / अंतराल को साफ़ करता है।
यह बहुत देर हो चुकी है ... लेकिन:
मूल रूप से, setTimeout / setInterval ID लगातार क्रम में जाती है, इसलिए केवल उच्चतम ID प्राप्त करने के लिए एक डमी टाइमआउट फ़ंक्शन बनाएं, फिर उससे कम सभी ID पर अंतराल साफ़ करें।
const highestId = window.setTimeout(() => {
for (let i = highestId; i >= 0; i--) {
window.clearInterval(i);
}
}, 0);