2012-01-14 20 views
61

क्या किसी दिए गए विंडो से सभी समय बहिष्कृत करने का कोई तरीका है? मुझे लगता है कि टाइमआउट window ऑब्जेक्ट में कहीं भी संग्रहीत हैं लेकिन इसकी पुष्टि नहीं कर सका।क्या सभी समय बहिष्कृत करने का कोई तरीका है?

कोई भी क्रॉस ब्राउज़र समाधान स्वागत है।

+0

संभावित डुप्लिकेट [जावास्क्रिप्ट का उपयोग कर सभी टाइमआउट्स और अंतराल को कैसे रोकें?] (Http://stackoverflow.com/questions/3141064/how-to-stop-all-timeouts-and-intervals-using-javascript) –

+0

दोस्त, यह सवाल 3 साल पहले से है और इसमें बहुत अच्छे जवाब हैं। उस के साथ गड़बड़ करने की कोई ज़रूरत नहीं है। – marcio

+0

मैंने इसकी खोज की और दोनों को मिला।आपका पुराना था इसलिए मैंने सोचा कि यह दो प्रश्नों को कम करने के लिए अच्छा हाउसकीपिंग होगा। मेरा सिर्फ एक वोट है; कुछ और लोगों को बंद करने के लिए मतदान करने की आवश्यकता होगी, और डुप्लिकेट लिंक दूसरों की मदद कर सकता है। –

उत्तर

95

वे विंडो ऑब्जेक्ट में नहीं हैं, लेकिन उनके पास आईडी हैं, जो (afaik) लगातार पूर्णांक हैं।

तो तुम तो जैसे सभी समय समाप्ति स्पष्ट हो सकता है:

var id = window.setTimeout(function() {}, 0); 

while (id--) { 
    window.clearTimeout(id); // will do nothing if no timeout with id is present 
} 
+1

विनिर्देश का यह हिस्सा है, या यह कार्यान्वयन-निर्भर हो सकता है? –

+0

यह निश्चित रूप से कार्यान्वयन-निर्भर है। लेकिन सभी ब्राउज़रों जो मुझे पता है कुछ वृद्धि वृद्धि तंत्र का उपयोग करें। हालांकि 1 पर शुरू नहीं हो सकता है। – user123444555621

+4

इसे 1 से शुरू करने की आवश्यकता नहीं है। [HTML5] (http://www.w3.org/TR/html5/timers.html#timers) spec कहता है "चलो हैंडल एक उपयोगकर्ता-एजेंट-परिभाषित पूर्णांक हो जो कि उससे बड़ा है शून्य जो इस कॉल द्वारा सेट किए जाने वाले टाइमआउट की पहचान करेगा। " जो संभाल के लिए कमरे को छोड़ देता है जिसमें निरंतर पूर्ण और गैर-छोटे पूर्णांक सहित कोई सकारात्मक पूर्णांक होता है। –

58

मुझे लगता है कि सबसे आसान तरीका है यह पूरा करने के एक सरणी, जहां आप आसानी से सभी पर clearTimeout() को पुनरावृति कर सकते हैं के सभी setTimeout पहचानकर्ताओं को संग्रहीत करने होगा उन्हें।

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]); 
} 
+11

से सहमत हूं इसमें केवल * * * सेट को साफ़ करने का बोनस (या संभावित दोष, मुझे लगता है) है, इसलिए आप अनजाने में बाहरी कोड को तोड़ नहीं पाएंगे। –

+1

+1, सभी टाइमआउट साफ़ नहीं करेगा लेकिन एक बार – marcio

+1

पर टाइमआउट के विशिष्ट समूह को साफ़ करने का एक अच्छा समाधान है क्योंकि यह सबसे अच्छा समाधान है क्योंकि यह बाहरी कोड नहीं तोड़ देगा, लेकिन जब से मैंने पूछा कि सभी टाइमआउट को कैसे साफ़ किया जाए @ Pumbaa80 उत्तर स्वीकार कर रहा है :) – marcio

1

एक वैश्विक टाइमआउट का उपयोग करें जो आपके सभी अन्य कार्यों से समय प्राप्त करता है। यह सबकुछ तेज़ी से चलाएगा, और प्रबंधित करना आसान होगा, हालांकि यह आपके कोड में कुछ अमूर्तता जोड़ देगा।

+0

मैं आपको पूरी तरह से समझ नहीं पा रहा हूं। आप 'set_timeout' वैश्विक फ़ंक्शन के व्यवहार को विस्तारित करना चाहते हैं? क्या आप एक उदाहरण कोड दे सकते हैं? – marcio

+1

मेरा मतलब था कि आपके पास प्रत्येक 50ms में एक बार वैश्विक ग्लोबल टाइमआउट चल रहा है। एक अन्य तत्व जो एक समय तत्व की आवश्यकता होगी, उसे वैश्विक टाइमआउट से पकड़ लेगा। Google ने दक्षता के लिए इसे स्विच किया, हालांकि मुझे अब उद्धृत आलेख नहीं मिल रहा है। कुछ और विस्तृत जानकारी स्पष्टीकरण के लिए –

9

मेरे पास Pumbaa80's answer का अतिरिक्त जोड़ा है जो पुराने आईई के लिए विकसित किसी के लिए उपयोगी हो सकता है।

हां, सभी प्रमुख ब्राउज़र लगातार पूर्णांक के रूप में टाइमआउट आईडी को लागू करते हैं (जो not required by specification है)। शुरुआती संख्या के ब्राउज़र ब्राउज़र ब्राउज़र के रूप में अलग है। ऐसा लगता है कि ओपेरा, सफारी, क्रोम और आईई> 8 1 से टाइमआउट आईडी, 2 से आईई < = 8 से यादृच्छिक संख्या से शुरू होता है जो टैब रीफ्रेश में जादुई रूप से सहेजा जाता है। आप discover it yourself कर सकते हैं।

सब meens आईई < = 8 में while (lastTimeoutId--) चक्र 8digits से अधिक बार चलाने के लिए और संदेश "धीरे-धीरे चलाने के लिए इंटरनेट एक्सप्लोरर खड़ी कर रहा है एक इस पृष्ठ पर स्क्रिप्ट" दिखा सकते हैं कि। तो यदि आप save all you timeout id's नहीं कर सकते हैं या override 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); 
    }; 
}); 

और फिर स्पष्ट सभी लंबित समय समाप्ति है कि शायद विदेशी कोड द्वारा स्थापित किया गया था तो कई बार आप

+0

प्लस वन। –

5

चाहते कैसे की दुकान के बारे में एक वैश्विक में टाइमआउट आईडी सरणी, और खिड़की के फ़ंक्शन कॉल को प्रतिनिधि करने के लिए एक विधि परिभाषित करें।

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 
    } 
}; 
1

हमने अभी इस सटीक मुद्दे को हल करने के लिए एक पैकेज प्रकाशित किया है।

npm install time-events-manager

कि के साथ, आप timeoutCollection & intervalCollection वस्तुओं के माध्यम से सभी समय समाप्ति और अंतराल देख सकते हैं। एक removeAll फ़ंक्शन भी है जो संग्रह और ब्राउज़र दोनों के सभी टाइमआउट/अंतराल को साफ़ करता है।

संबंधित मुद्दे