फ़ंक्शन निष्पादित करने के लिए jquery अंतराल। jQuery फ़ंक्शन सेटटाइमआउट() के उदाहरण। सेटटाइमआउट में पैरामीटर पास करना

💖क्या आपको यह पसंद है?लिंक को अपने दोस्तों के साथ साझा करें
  • से:
  • पंजीकृत: 2014.07.08
  • पद: 3,896
  • पसंद: 497
विषय: SetTimeOut और SetInterval, जावास्क्रिप्ट में किसका उपयोग करना बेहतर है?

सेटइंटरवल फ़ंक्शन को नियमित अंतराल पर कई बार कोड चलाने के लिए डिज़ाइन किया गया है। हालाँकि, इसके कई नुकसान हैं, मुख्य रूप से अलग-अलग व्यवहार विभिन्न ब्राउज़र.

पहला अंतर उस समय का अंतर है जिस पर अगले लॉन्च के लिए टाइमर सेट किया जाता है। आइए एक छोटा सा परीक्षण बनाएं: हम पिछले रन की शुरुआत और उसके अंत के बाद से बीते समय की मात्रा को मापेंगे।

var d1 = नई तिथि(), d2 = नई तिथि(); setInterval(function() ( var d = new Date(); document.body.innerHTML += (d - d1) + " " + (d - d2) + "
"; // फ़ंक्शन की शुरुआत में एक निशान लगाएं d1 = new Date(); while (new Date() - d1< 200); // ничего не делаем 200 миллисекунд // И в конце функции d2 = new Date(); }, 1000);

दूसरी पंक्ति से प्रारंभ करके आउटपुट जानकारीपूर्ण होगा।

फ़ायरफ़ॉक्स, ओपेरा, सफारी और क्रोम में स्थिति समान होगी: पहली संख्या लगभग 1000 के बराबर होगी, दूसरी - 200 कम। अंतर केवल मूल्यों के प्रसार में होगा। सबसे छोटा अंतर क्रोम और ओपेरा में है।

2 पुनबीबी द्वारा उत्तर (पुनबीबी द्वारा संपादित 2017.06.08 16:45)
  • प्रेषक: मॉस्को, सोवखोज़्ने 3, उपयुक्त। 98
  • पंजीकृत: 2014.07.08
  • पद: 3,896
  • पसंद: 497

एक और अंतर जो कम ध्यान देने योग्य है और पुन: उत्पन्न करने में अधिक कठिन है, लेकिन कभी-कभी बहुत परेशानी का कारण बन सकता है, सिस्टम समय परिवर्तनों का प्रतिरोध है। यदि आप निम्नलिखित परीक्षण चलाते हैं

सेटइंटरवल(फ़ंक्शन() ( document.body.innerHTML = Math.random(); ), 500);

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

सेटइंटरवल फ़ंक्शन का एक और छोटा नुकसान यह है कि इसकी कार्रवाई को रोकने में सक्षम होने के लिए, आपको इसके पहचानकर्ता को कहीं न कहीं याद रखना होगा, जो हमेशा सुविधाजनक नहीं होता है।

3 पुनबीबी द्वारा उत्तर
  • प्रेषक: मॉस्को, सोवखोज़्ने 3, उपयुक्त। 98
  • पंजीकृत: 2014.07.08
  • पद: 3,896
  • पसंद: 497
पुन: SetTimeOut और SetInterval, जावास्क्रिप्ट में किसका उपयोग करना बेहतर है?

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

सेटइंटरवल का एक महत्वपूर्ण विकल्प पुनरावर्ती सेटटाइमआउट है:

/** इसके बजाय: var timerId = setInterval(function() ( अलर्ट('टिक'); ), 2000); */ var टाइमरआईडी = सेटटाइमआउट (फ़ंक्शन टिक() ( अलर्ट ("टिक"); टाइमरआईडी = सेटटाइमआउट (टिक, 2000); ), 2000);

उपरोक्त कोड में, अगला निष्पादन पिछले निष्पादन के तुरंत बाद निर्धारित किया गया है।

रिकर्सिव सेटटाइमआउट, सेटइंटरवल की तुलना में अधिक लचीली टाइमिंग विधि है, क्योंकि वर्तमान निष्पादन के परिणामों के आधार पर, अगले निष्पादन तक का समय अलग-अलग निर्धारित किया जा सकता है।

उदाहरण के लिए, हमारे पास एक ऐसी सेवा है जो हर 5 सेकंड में नए डेटा के लिए सर्वर पर सर्वेक्षण करती है। यदि सर्वर अतिभारित है, तो आप मतदान अंतराल को 10, 20, 60 सेकंड तक बढ़ा सकते हैं... और फिर सब कुछ सामान्य होने पर इसे वापस लौटा सकते हैं।

यदि हम नियमित रूप से सीपीयू-गहन कार्य चलाते हैं, तो हम उनके निष्पादन पर खर्च किए गए समय का अनुमान लगा सकते हैं और अगले रन की योजना पहले या बाद में बना सकते हैं।

4 पुनबीबी द्वारा उत्तर
  • प्रेषक: मॉस्को, सोवखोज़्ने 3, उपयुक्त। 98
  • पंजीकृत: 2014.07.08
  • पद: 3,896
  • पसंद: 497
पुन: SetTimeOut और SetInterval, जावास्क्रिप्ट में किसका उपयोग करना बेहतर है?

पुनरावर्ती सेटटाइमआउट कॉल के बीच विराम की गारंटी देता है, सेटइंटरवल नहीं।

आइए दोनों कोड की तुलना करें। पहला सेटइंटरवल का उपयोग करता है:

वर मैं = 1; सेटइंटरवल(फ़ंक्शन() ( func(i); ), 100);

दूसरा पुनरावर्ती सेटटाइमआउट का उपयोग करता है:

वर मैं = 1; सेटटाइमआउट(फ़ंक्शन रन() ( func(i); सेटटाइमआउट(रन, 100); ), 100);

सेटइंटरवल के साथ, आंतरिक टाइमर बिल्कुल हर 100 एमएस पर सक्रिय होगा और func(i) को कॉल करेगा:

सेटइंटरवल के साथ फंक कॉल के बीच वास्तविक ठहराव कोड में दर्शाए गए से कम है!

यह स्वाभाविक है, क्योंकि फ़ंक्शन के संचालन समय को किसी भी तरह से ध्यान में नहीं रखा जाता है; यह अंतराल के हिस्से को "खा जाता है"।

यह भी संभव है कि func हमारी अपेक्षा से अधिक जटिल निकला और निष्पादित होने में 100 एमएस से अधिक समय लगा।

इस मामले में, दुभाषिया फ़ंक्शन पूरा होने तक प्रतीक्षा करेगा, फिर टाइमर की जांच करेगा और, यदि सेटइंटरवल को कॉल करने का समय पहले ही आ चुका है (या बीत चुका है), तो अगली कॉल तुरंत होगी।

यदि फ़ंक्शन सेटइंटरवल पॉज़ से अधिक समय तक चलता है, तो कॉल बिना किसी रुकावट के होंगी।

5 सेम्पाई द्वारा उत्तर
  • प्रेषक: जेरूसलम
  • पंजीकृत: 2015.06.02
  • पद: 958
  • पसंद: 274
पुन: SetTimeOut और SetInterval, जावास्क्रिप्ट में किसका उपयोग करना बेहतर है?

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

इस समय SetInterval का नुकसान यह है कि यह स्क्रिप्ट (फ़ंक्शन) के निष्पादन समय को ध्यान में नहीं रखता है, और यदि, उदाहरण के लिए, आप इसे भारी प्रश्नों के लिए उपयोग करते हैं, तो अंतराल समय काफी कम हो जाएगा, और यह विभिन्न ब्राउज़रों में भिन्न हो सकते हैं.

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

यह समझना बेहद ज़रूरी है कि वे कैसे काम करते हैं जावास्क्रिप्ट टाइमर. अक्सर उनका व्यवहार मल्टीथ्रेडिंग की हमारी सहज समझ से मेल नहीं खाता है, और यह इस तथ्य के कारण है कि वास्तव में वे एक ही थ्रेड में निष्पादित होते हैं। आइए चार फ़ंक्शन देखें जिनके साथ हम टाइमर प्रबंधित कर सकते हैं:

  • var id = setTimeout(fn, देरी); - एक साधारण टाइमर बनाता है जो किसी दिए गए विलंब के बाद दिए गए फ़ंक्शन को कॉल करेगा। फ़ंक्शन एक अद्वितीय आईडी लौटाता है जिसके साथ टाइमर को रोका जा सकता है।
  • var id = setInterval(fn, देरी); - सेटटाइमआउट के समान, लेकिन किसी दिए गए अंतराल पर फ़ंक्शन को लगातार कॉल करता है (बंद होने तक)।
  • क्लियरइंटरवल(आईडी);, क्लियरटाइमआउट(आईडी); - एक टाइमर आईडी स्वीकार करता है (ऊपर वर्णित कार्यों में से एक द्वारा लौटाया जाता है) और कॉलबैक का निष्पादन रोक देता है।
विचार करने का मुख्य विचार यह है कि टाइमर विलंब अवधि की सटीकता की गारंटी नहीं है। आरंभ करने के लिए, ब्राउज़र सभी अतुल्यकालिक जावास्क्रिप्ट घटनाओं को एक थ्रेड (जैसे माउस क्लिक या टाइमर) में निष्पादित करता है और केवल उस समय जब उस घटना की बारी होती है। इसे निम्नलिखित चित्र द्वारा सर्वोत्तम रूप से प्रदर्शित किया गया है:

इस आंकड़े में लेने के लिए बहुत सारी जानकारी है, लेकिन इसे समझने से आपको जावास्क्रिप्ट एसिंक्रोनी कैसे काम करती है इसकी गहरी समझ मिलेगी। यह चार्ट मिलीसेकंड में लंबवत रूप से समय का प्रतिनिधित्व करता है, नीले ब्लॉक निष्पादित किए गए जावास्क्रिप्ट कोड के ब्लॉक दिखाते हैं। उदाहरण के लिए, पहला ब्लॉक औसतन 18ms में निष्पादित होता है, एक माउस क्लिक लगभग 11ms के लिए निष्पादन को अवरुद्ध करता है, आदि।

जावास्क्रिप्ट केवल कोड के एक हिस्से को निष्पादित कर सकता है (निष्पादन की एकल-थ्रेडेड प्रकृति के कारण), जिनमें से प्रत्येक अन्य अतुल्यकालिक घटनाओं के निष्पादन को अवरुद्ध करता है। इसका मतलब यह है कि जब कोई अतुल्यकालिक घटना होती है (जैसे कि माउस क्लिक, टाइमर कॉल, या XMLHttp अनुरोध का पूरा होना), तो इसे एक कतार में जोड़ा जाता है और बाद में निष्पादित किया जाता है (निश्चित रूप से कार्यान्वयन ब्राउज़र के अनुसार भिन्न होता है, लेकिन चलो सहमत हैं इसे "कतार" कहें)।

आरंभ करने के लिए, आइए कल्पना करें कि दो टाइमर एक जावास्क्रिप्ट ब्लॉक के अंदर शुरू होते हैं: 10ms की देरी के साथ सेटटाइमआउट और उसी देरी के साथ सेटइंटरवल। टाइमर कब शुरू होगा इसके आधार पर, यह उस समय सक्रिय होगा जब हमने अभी तक कोड का पहला ब्लॉक पूरा नहीं किया है। हालाँकि, ध्यान दें कि यह तुरंत सक्रिय नहीं होता है (सिंगल थ्रेडिंग के कारण यह संभव नहीं है)। इसके बजाय, स्थगित फ़ंक्शन को कतारबद्ध किया जाता है और अगले उपलब्ध क्षण पर निष्पादित किया जाता है।

साथ ही, पहले जावास्क्रिप्ट ब्लॉक के निष्पादन के दौरान, एक माउस क्लिक होता है। इस अतुल्यकालिक घटना के लिए हैंडलर (और यह अतुल्यकालिक है क्योंकि हम इसकी भविष्यवाणी नहीं कर सकते हैं) को इस समय सीधे निष्पादित नहीं किया जा सकता है, इसलिए यह भी टाइमर की तरह एक कतार में समाप्त हो जाता है।

जावास्क्रिप्ट कोड का पहला ब्लॉक निष्पादित होने के बाद, ब्राउज़र प्रश्न पूछता है, "क्या निष्पादित होने की प्रतीक्षा है?" इस स्थिति में, माउस क्लिक हैंडलर और टाइमर प्रतीक्षा स्थिति में हैं। ब्राउज़र उनमें से एक (क्लिक हैंडलर) का चयन करता है और उसे निष्पादित करता है। टाइमर निष्पादन कतार में अगले उपलब्ध समय की प्रतीक्षा करेगा।

ध्यान दें कि जब माउस क्लिक हैंडलर निष्पादित हो रहा होता है, तो पहला अंतराल-कॉलबैक सक्रिय हो जाता है। टाइमर-कॉलबैक की तरह, इसे कतारबद्ध किया जाएगा। हालाँकि, ध्यान दें कि जब अंतराल फिर से सक्रिय होता है (जबकि टाइमर-कॉलबैक चल रहा है), तो इसे कतार से हटा दिया जाएगा। यदि कोड के एक बड़े टुकड़े को निष्पादित करते समय प्रत्येक अंतराल-कॉलबैक को कतारबद्ध किया जाता है, तो इसके परिणामस्वरूप कार्यों का एक समूह होगा जो कॉल करने की प्रतीक्षा कर रहे होंगे, उनके निष्पादन को पूरा करने के बीच कोई देरी अवधि नहीं होगी। इसके बजाय, ब्राउज़र तब तक इंतजार करते हैं जब तक कि कोई न हो कतार में एक और फ़ंक्शन जोड़ने से पहले कतार में और फ़ंक्शन बचे हैं।

इस प्रकार, हम उस मामले का निरीक्षण कर सकते हैं जब अंतराल-कॉलबैक की तीसरी फायरिंग उस क्षण के साथ मेल खाती है जब इसे पहले ही निष्पादित किया जा चुका है। यह एक महत्वपूर्ण बिंदु को दर्शाता है: अंतराल को इस बात की परवाह नहीं है कि वर्तमान में क्या चल रहा है, उन्हें निष्पादन के बीच की देरी की अवधि की परवाह किए बिना कतार में जोड़ा जाएगा।

अंत में, दूसरा अंतराल-कॉलबैक पूरा होने के बाद, हम देखेंगे कि जावास्क्रिप्ट इंजन को निष्पादित करने के लिए कुछ भी नहीं बचा है। इसका मतलब यह है कि ब्राउज़र फिर से नई एसिंक्रोनस घटनाओं के घटित होने की प्रतीक्षा करता है। यह 50 एमएस के निशान पर होगा, जहां अंतराल-कॉलबैक फिर से काम करेगा। इस बिंदु पर इसे रोकने के लिए कुछ भी नहीं होगा, इसलिए यह तुरंत काम करेगा।

आइए एक उदाहरण देखें जो सेटटाइमआउट और सेटइंटरवल के बीच अंतर को अच्छी तरह से दिखाता है।
setTimeout(function())( /* कोड का कुछ लंबा ब्लॉक... */ setTimeout(arguments.callee, 10); ), 10); setInterval(function())( /* कोड का कुछ लंबा ब्लॉक... */ ), 10);
ये दोनों विकल्प पहली नज़र में समतुल्य हैं, लेकिन वास्तव में ये नहीं हैं। पिछली कॉल के बाद सेटटाइमआउट का उपयोग करने वाले कोड में हमेशा कम से कम 10 एमएस की देरी होगी (यह अधिक हो सकती है, लेकिन कभी भी कम नहीं), जबकि सेटइंटरवल का उपयोग करने वाले कोड को हर 10 एमएस पर कॉल किया जाएगा, भले ही पिछली कॉल कब हुई हो।

आइए ऊपर कही गई हर बात को संक्षेप में प्रस्तुत करें:
- जावास्क्रिप्ट इंजन एकल-थ्रेडेड वातावरण का उपयोग करते हैं, अतुल्यकालिक घटनाओं को निष्पादन की प्रतीक्षा में कतार में परिवर्तित करते हैं,
- सेटटाइमआउट और सेटइंटरवल फ़ंक्शंस को एसिंक्रोनस कोड में मौलिक रूप से अलग तरीके से निष्पादित किया जाता है,
- यदि टाइमर को निष्पादित नहीं किया जा सकता है इस पल, इसमें अगले निष्पादन बिंदु तक विलंब होगा (जो वांछित विलंब से अधिक लंबा होगा),
- अंतराल (सेटइंटरवल) को बिना किसी देरी के एक के बाद एक निष्पादित किया जा सकता है यदि उनके निष्पादन में निर्दिष्ट देरी से अधिक समय लगता है।

ये सब बेहद है महत्वपूर्ण सूचनाविकास के लिए। यह जानना कि जावास्क्रिप्ट इंजन कैसे काम करता है, विशेष रूप से बहुत सारी अतुल्यकालिक घटनाओं (जो अक्सर होता है) के साथ, उन्नत अनुप्रयोगों के निर्माण के लिए एक महान आधार तैयार करता है।

विंडो और वर्कर इंटरफेस पर पेश की गई सेटइंटरवल () विधि, प्रत्येक कॉल के बीच एक निश्चित समय विलंब के साथ, बार-बार एक फ़ंक्शन को कॉल करती है या एक कोड स्निपेट निष्पादित करती है। यह एक अंतराल आईडी लौटाता है जो विशिष्ट रूप से अंतराल की पहचान करता है, इसलिए आप इसे बाद में ClearInterval() पर कॉल करके हटा सकते हैं। इस विधि को windowOrWorkerGlobalScope Mixin द्वारा परिभाषित किया गया है।

वाक्य - विन्यास वर अंतरालआईडी = दायरा.सेटइंटरवल( समारोह, देरी, [arg1, arg2, ...]); वर अंतरालआईडी = दायरा.सेटइंटरवल( कोड, देरी); पैरामीटर्स func प्रत्येक विलंब मिलीसेकंड में निष्पादित किया जाने वाला एक फ़ंक्शन। फ़ंक्शन में कोई तर्क पारित नहीं किया गया है, और कोई रिटर्न मान अपेक्षित नहीं है। कोड एक वैकल्पिक सिंटैक्स आपको फ़ंक्शन के बजाय एक स्ट्रिंग शामिल करने की अनुमति देता है, जिसे प्रत्येक विलंब मिलीसेकंड में संकलित और निष्पादित किया जाता है। यह वाक्यविन्यास है सिफारिश नहीं की गईउन्हीं कारणों से जो eval() के उपयोग को सुरक्षा जोखिम बनाते हैं। विलंब समय, मिलीसेकंड (एक सेकंड का हजारवां हिस्सा) में, टाइमर को निर्दिष्ट फ़ंक्शन या कोड के निष्पादन के बीच में देरी करनी चाहिए। विलंब मानों की अनुमत सीमा के विवरण के लिए नीचे देखें। arg1, ..., argN वैकल्पिक अतिरिक्त तर्क जो निर्दिष्ट फ़ंक्शन के माध्यम से पारित किए जाते हैं समारोहएक बार टाइमर समाप्त हो जाता है.

नोट: पहले सिंटैक्स में setInterval() में अतिरिक्त तर्क पास करना काम नहीं करता है इंटरनेट एक्सप्लोरर 9 और पहले. यदि आप उस ब्राउज़र पर इस कार्यक्षमता को सक्षम करना चाहते हैं, तो आपको एक पॉलीफ़िल का उपयोग करना होगा (अनुभाग देखें)।

प्रतिलाभ की मात्रा

लौटाया गया अंतराल आईडी एक संख्यात्मक, गैर-शून्य मान है जो setInterval() पर कॉल द्वारा बनाए गए टाइमर की पहचान करता है; टाइमआउट को रद्द करने के लिए इस मान को पारित किया जा सकता है।

यह जानना उपयोगी हो सकता है कि setInterval() और setTimeout() आईडी का एक ही पूल साझा करते हैं, और यह कि ClearInterval() और ClearTimeout() को तकनीकी रूप से एक दूसरे के स्थान पर उपयोग किया जा सकता है। हालाँकि, स्पष्टता के लिए, आपको अपना कोड बनाए रखते समय भ्रम से बचने के लिए हमेशा उनका मिलान करने का प्रयास करना चाहिए।

नोट: विलंब तर्क को हस्ताक्षरित 32-बिट पूर्णांक में परिवर्तित किया जाता है। यह प्रभावी रूप से विलंब को 2147483647 एमएस तक सीमित करता है, क्योंकि यह आईडीएल में एक हस्ताक्षरित पूर्णांक के रूप में निर्दिष्ट है।

उदाहरण उदाहरण 1: मूल वाक्यविन्यास

निम्नलिखित उदाहरण setInterval() के मूल सिंटैक्स को प्रदर्शित करता है।

वार इंटरवलआईडी = विंडो.सेटइंटरवल(मायकॉलबैक, 500, "पैरामीटर 1", "पैरामीटर 2"); फ़ंक्शन myCallback(a, b) ( // आपका कोड यहां // पैरामीटर पूरी तरह से वैकल्पिक हैं। console.log(a); console.log(b); )

उदाहरण 2: दो रंगों को बारी-बारी से बदलना

निम्नलिखित उदाहरण फ्लैशटेक्स्ट() फ़ंक्शन को स्टॉप बटन दबाए जाने तक एक सेकंड में एक बार कॉल करता है।

सेटइंटरवल/क्लियरइंटरवल उदाहरण var nIntervId; फ़ंक्शन चेंज कलर() ( nIntervId = setInterval(flashText, 1000); ) फ़ंक्शन flashText() ( var oElem = document.getElementById("my_box"); oElem.style.color = oElem.style.color == "red" ? " नीला" : "लाल"; // oElem.style.color == "लाल" ? "नीला" : "लाल" एक टर्नरी ऑपरेटर है। ) फ़ंक्शन stopTextColor() ( ClearInterval(nIntervId); )

हैलो वर्ल्ड

रुकना

उदाहरण 3: टाइपराइटर सिमुलेशन

निम्नलिखित उदाहरण टाइपराइटर को पहले साफ़ करके और फिर धीरे-धीरे नोडलिस्ट में सामग्री टाइप करके अनुकरण करता है जो चयनकर्ताओं के एक निर्दिष्ट समूह से मेल खाता है।

जावास्क्रिप्ट टाइपराइटर - एमडीएन उदाहरण फ़ंक्शन टाइपराइटर (sSelector, nRate) ( फ़ंक्शन क्लीन () ( क्लियरइंटरवल (nIntervId); bTyping = false; bStart = true; oCurrent = null; aSheets.length = nIdx = 0; ) फ़ंक्शन स्क्रॉल (oSheet, nPos , bEraseAndStop) ( यदि (!oSheet.hasOwnProperty("parts") || aMap.length< nPos) { return true; } var oRel, bExit = false; if (aMap.length === nPos) { aMap.push(0); } while (aMap < oSheet.parts.length) { oRel = oSheet.parts]; scroll(oRel, nPos + 1, bEraseAndStop) ? aMap++ : bExit = true; if (bEraseAndStop && (oRel.ref.nodeType - 1 | 1) === 3 && oRel.ref.nodeValue) { bExit = true; oCurrent = oRel.ref; sPart = oCurrent.nodeValue; oCurrent.nodeValue = ""; } oSheet.ref.appendChild(oRel.ref); if (bExit) { return false; } } aMap.length--; return true; } function typewrite () { if (sPart.length === 0 && scroll(aSheets, 0, true) && nIdx++ === aSheets.length - 1) { clean(); return; } oCurrent.nodeValue += sPart.charAt(0); sPart = sPart.slice(1); } function Sheet (oNode) { this.ref = oNode; if (!oNode.hasChildNodes()) { return; } this.parts = Array.prototype.slice.call(oNode.childNodes); for (var nChild = 0; nChild < this.parts.length; nChild++) { oNode.removeChild(this.parts); this.parts = new Sheet(this.parts); } } var nIntervId, oCurrent = null, bTyping = false, bStart = true, nIdx = 0, sPart = "", aSheets = , aMap = ; this.rate = nRate || 100; this.play = function () { if (bTyping) { return; } if (bStart) { var aItems = document.querySelectorAll(sSelector); if (aItems.length === 0) { return; } for (var nItem = 0; nItem < aItems.length; nItem++) { aSheets.push(new Sheet(aItems)); /* Uncomment the following line if you have previously hidden your elements via CSS: */ // aItems.style.visibility = "visible"; } bStart = false; } nIntervId = setInterval(typewrite, this.rate); bTyping = true; }; this.pause = function () { clearInterval(nIntervId); bTyping = false; }; this.terminate = function () { oCurrent.nodeValue += sPart; sPart = ""; for (nIdx; nIdx < aSheets.length; scroll(aSheets, 0, false)); clean(); }; } /* usage: */ var oTWExample1 = new Typewriter(/* elements: */ "#article, h1, #info, #copyleft", /* frame rate (optional): */ 15); /* default frame rate is 100: */ var oTWExample2 = new Typewriter("#controls"); /* you can also change the frame rate value modifying the "rate" property; for example: */ // oTWExample2.rate = 150; onload = function () { oTWExample1.play(); oTWExample2.play(); }; span.intLink, a, a:visited { cursor: pointer; color: #000000; text-decoration: underline; } #info { width: 180px; height: 150px; float: right; background-color: #eeeeff; padding: 4px; overflow: auto; font-size: 12px; margin: 4px; border-radius: 5px; /* visibility: hidden; */ }

मोज़िला डेवलपर नेटवर्क द्वारा CopyLeft 2012

[ चलायें | रोकें | समाप्त करें]

विवामस ब्लैंडिट मस्सा यूट मेटस मैटिस इन फ्रिंजिला लेक्टस इम्पर्डिएट। फेलिस ऑर्नारे वाहनों से पहले एक बार। फ़्यूसे पेलेंटेस्क लैकस विटे इरोज कन्वालिस यूटी मोलिस मैग्ना पेलेंटेस्क। पेलेंटेस्क प्लेसेरेट एनिम और लैकस अल्ट्रासिस विटे फैसिलिसिस निसी फ्रिंजिला। टिनसीडंट टिनसीडंट टिनसीडंट में। जावास्क्रिप्ट टाइपराइटर

लोरेम इप्सम डोलर सिट अमेट, कंसेक्टेचर एडिपिसिंग एलीट। नुलम अल्ट्रिसेस डोलर एसी डोलर इम्परडिएट उल्लमकोर्पर। सस्पेंडिसे क्वाम लिबरो, लक्टस ऑक्टर मोलिस सेड, मालेसुआडा कॉन्डिमेंटम मैग्ना। एंटे टेलस में क्विस्क, प्लेसरैट स्था में। पेलेंटेस्क हैबिटेंट मोरबी ट्रिस्टिक सेनेक्टस एट नेटस एट मालेसुआडा फेम्स एसी टर्पिस एगेस्टास। डोनेक ए मील मैग्ना, क्विस मैटिस डोलर। एटियम सिट अमेट लिगुला क्विस उर्ना ऑक्टर इम्परडिएट नेक फौसीबस एंटे। मौरिस वेल कंसेक्टेचर डोलर। नंक एगेट एलीट एगेट वेलिट पुल्विनर फ्रिंजिला कंसेक्टेचर एलिक्वम प्यूरस। कुराबिटूर कॉन्वालिस, जस्टो पोसुएरे पोर्टा एगेस्टास, वेलिट एराट ओरनारे टॉर्टर, नॉन विवररा जस्टो डायम एगेट आर्कू। फ़ैसेलस एडिपिसिंग फ़र्मेंटम निभ एसी कमोडो। नाम टरपिस नंक, ससिपिट ए हेंड्रेरिट विटे, वोलुटपत नॉन इप्सम।

फ़ैसेलस एसी निस्ल लोरेम:
नल्लम कमोडो ससिपिट लैकस नॉन एलिकेट। फ़ैसेलस एसी निस्ल लोरेम, सेड फैसिलिसिस लिगुला। नाम कर्सस लोबॉर्टिस प्लासेराट। सेड डुई निसी, एलीमेंटम ईयू सोडेल्स एसी, प्लेसरैट सिट अमेट मौरिस। पेलेंटेस्क डेपिबस टेलस यूटी इप्सम एलिक्वम ईयू ऑक्टर डुई वाहन। क्विस्क अल्ट्रिसेस लॉरेट एराट, एट अल्ट्रिसेस टॉर्टर सोडेल्स नॉन। सेड वेनेनाटिस लैक्टस मैग्ना, अल्ट्रासीज अल्ट्रासीज नंक फ्रिंजिला एगेट। प्रेजेंट स्केलेरिस्क उरना विटे निभ ट्रिस्टिक वेरियस कॉन्सक्वेट नेक लक्टस। पूर्णांक ऑर्नारे, एराट ए पोर्टा टेम्पस, वेलिट जस्टो फेरमेंटम एलीट, ए फेरमेंटम मेटस निसी ईयू इप्सम। विवामस एगेट ऑगु वेल डुइ विवररा एडिपिसिंग कोनगु यूट मस्सा। प्रेजेंट विटे इरोस एराट, पुल्विनर लॉरेट मैग्ना। पोसुएरे में मेकेनस वेस्टिबुलम मोलिस नंक। पेलेंटेस्क सिट अमेट मेटस ए टरपिस लोबॉर्टिस टेम्पोर ईयू वेल टॉर्टर। क्रैस सोडेल्स एलीफेंड इंटरडम।

डुइस लोबोर्टिस सेपियन क्विस निस्ल लक्टस पोर्टिटोर। टेम्पोर सेम्पर लिबरो में, ईयू टिनसीडंट डोलर एलीफेंड सिट अमेट। यूटी एनईसी वेलिट इन डोलोर टिनसिडंट रोनकस नॉन नॉन डायम। मोरबी ऑक्टर ऑर्नारे ओरसी, नॉन यूइस्मोड फेलिस ग्रेविडा नेक। कुराबिटुर एलिमेंटम निसी ए इरोस रट्रम नेक ब्लैंडिट डायम प्लासेराट। एनियन टिन्सिडंट रिसस यूट निसी कंसेक्टेचर कर्सस। आपका जीवन अच्छा है. डोनेक डिग्निसिम इस समय अस्थायी परिणाम में है। एलिक्वम एलिक्वम डायम नॉन फेलिस कन्वालिस सस्किपिट। पूर्ण सुविधा. डोनेक लैकस रिसस, डिग्निसिम एट फ्रिंजिला एट, एगेस्टास वेल इरोस। डुइस मालेसुआडा एक्यूमसन डुई, और फ्रिंजिला मौरिस बिबस्टार्टम क्विस। क्रस एडिपिसिंग अल्ट्रासीज किण्वन। प्रेजेंट बिबस्टार्टम कॉन्डिमेंटम फ्यूगिएट।

नाम फौसीबस, लिगुला ईयू फ्रिंजिला पुल्विनर, लेक्टस टेलस इयाकुलिस नूनक, विटे स्केलेरिस्क मेटस लियो नॉन मेटस। प्रोइन मैटिस लोबोर्टिस लोबोर्टिस। क्विस्क एक्युमसन फौसीबस एराट, वेल वेरियस टॉर्टर अल्ट्रासीज एसी। लोरेम इप्सम डोलर सिट अमेट, कंसेक्टेचर एडिपिसिंग एलीट। सेड नेक लिबरो नंक. नल्लम टॉर्टर नंक, एलिमेंटम ए कंसेक्टेचर एट, अल्ट्रिसेस ईयू ओरसी। लोरेम इप्सम डोलर सिट अमेट, कंसेक्टेचर एडिपिसिंग एलीट। एक निस्ल ईयू सेम वेहिकुला एगेस्टास का आनंद लें।

कॉलबैक तर्क

जैसा कि पहले चर्चा की गई है, इंटरनेट एक्सप्लोरर संस्करण 9 और नीचे कॉलबैक फ़ंक्शन में setTimeout() या setInterval() में तर्क पारित करने का समर्थन नहीं करते हैं। निम्नलिखित IE-विशिष्ट कोड इस सीमा पर काबू पाने के लिए एक विधि प्रदर्शित करता है। उपयोग करने के लिए, बस निम्नलिखित कोड को अपनी स्क्रिप्ट के शीर्ष पर जोड़ें।

/*\ |*| |*| IE-विशिष्ट पॉलीफ़िल जो |*| तक मनमाने तर्कों को पारित करने में सक्षम बनाता है जावास्क्रिप्ट टाइमर के कॉलबैक फ़ंक्शन (HTML5 मानक सिंटैक्स)..सेटइंटरवल |*| https://साइट/उपयोगकर्ता:फ्यूजनचेस |*| |*| सिंटैक्स: |*| var टाइमआउटआईडी = window.setTimeout(func, देरी[, arg1, arg2, ...]); |*| var timeoutID = window.setTimeout(कोड, विलंब); |*| var अंतरालआईडी = window.setInterval(func, देरी[, arg1, arg2, ...]); |*| var अंतरालआईडी = window.setInterval(कोड, विलंब); |*| \*/ यदि (document.all && !window.setTimeout.isPolyfill) ( var __nativeST__ = window.setTimeout; window.setTimeout = function (vCallback, nDelay /*, ArgumentToPass1, ArgumentToPass2, आदि। */) ( var aArgs = Array .prototype.slice.call(arguments, 2); return __nativeST__(vCallbackinstanceof Function() ( vCallback.apply(null, aArgs); ) : vCallback, nDelay ); if (document.all && !window.setInterval.isPolyfill) ( var __nativeSI__ = window.setInterval; window.setInterval = function (vCallback, nDelay /*, ArgumentToPass1, ArgumentToPass2, आदि। */) ( var aArgs = Array.prototype. स्लाइस.कॉल(तर्क, 2); वापसी __nativeSI__(vCallback फ़ंक्शन का उदाहरण () (vCallback.apply(null, aArgs); ) : vCallback, nDelay);

एक अन्य संभावना आपके कॉलबैक को कॉल करने के लिए किसी अज्ञात फ़ंक्शन का उपयोग करना है, हालांकि यह समाधान थोड़ा अधिक महंगा है। उदाहरण:

वार इंटरवलआईडी = सेटइंटरवल(फ़ंक्शन() ( myFunc("एक", "दो", "तीन"); ), 1000); var अंतरालआईडी = सेटइंटरवल(फ़ंक्शन(arg1)().बाइंड(अपरिभाषित, 10), 1000);

निष्क्रिय टैब के लिए गेको 5.0 (फ़ायरफ़ॉक्स 5.0 / थंडरबर्ड 5.0 / सीमंकी 2.2) की आवश्यकता है

गेको 5.0 (फ़ायरफ़ॉक्स 5.0 / थंडरबर्ड 5.0 / सीमंकी 2.2) से शुरू होकर, अंतराल को निष्क्रिय टैब में प्रति सेकंड एक बार से अधिक बार फायर करने के लिए क्लैंप किया जाता है।

"यह" समस्या

जब आप setInterval() या किसी अन्य फ़ंक्शन के लिए कोई विधि पास करते हैं, तो इसे गलत मान के साथ लागू किया जाता है। इस समस्या को जावास्क्रिप्ट संदर्भ में विस्तार से बताया गया है।

स्पष्टीकरण

setInterval() द्वारा निष्पादित कोड उस फ़ंक्शन से अलग निष्पादन संदर्भ में चलता है जिससे इसे कॉल किया गया था। परिणामस्वरूप, कॉल किए गए फ़ंक्शन के लिए यह कीवर्ड विंडो (या वैश्विक) ऑब्जेक्ट पर सेट किया गया है, यह उस फ़ंक्शन के लिए इस मान के समान नहीं है जिसे setTimeout कहा जाता है। निम्नलिखित उदाहरण देखें (जो setInterval() के बजाय setTimeout() का उपयोग करता है - समस्या, वास्तव में, दोनों टाइमर के लिए समान है):

MyArray = ["शून्य", "एक", "दो"]; myArray.myMethod = फ़ंक्शन (sProperty) ( चेतावनी(arguments.length > 0 ? यह : यह); ); myArray.myMethod(); // "शून्य, एक, दो" myArray.myMethod(1) प्रिंट करता है; // "एक" सेटटाइमआउट (myArray.myMethod, 1000) प्रिंट करता है; // 1 सेकंड सेटटाइमआउट के बाद "" प्रिंट करता है (myArray.myMethod, 1500, "1"); // 1.5 सेकंड के बाद "अपरिभाषित" प्रिंट करता है // .call के साथ "इस" ऑब्जेक्ट को पास करने से काम नहीं चलेगा // क्योंकि इससे सेटटाइमआउट के अंदर ही इसका मान बदल जाएगा // जबकि हम myArray के अंदर इसका मान बदलना चाहते हैं .myMethod // वास्तव में, यह एक त्रुटि होगी क्योंकि सेटटाइमआउट कोड को यह विंडो ऑब्जेक्ट होने की उम्मीद है: setTimeout.call(myArray, myArray.myMethod, 2000); // त्रुटि: "NS_ERROR_XPC_BAD_OP_ON_WN_PROTO: WrappedNative प्रोटोटाइप ऑब्जेक्ट पर अवैध संचालन" setTimeout.call(myArray, myArray.myMethod, 2500, 2); // वही त्रुटि

जैसा कि आप देख सकते हैं कि लीगेसी जावास्क्रिप्ट में इस ऑब्जेक्ट को कॉलबैक फ़ंक्शन में पास करने का कोई तरीका नहीं है।

एक संभावित समाधान

"इस" समस्या को हल करने का एक संभावित तरीका दो मूल सेटटाइमआउट() या सेटइंटरवल() वैश्विक फ़ंक्शंस को दो से बदलना है गैर देशीवे जो Function.prototype.call विधि के माध्यम से अपने आह्वान को सक्षम करते हैं। निम्नलिखित उदाहरण संभावित प्रतिस्थापन दिखाता है:

// जावास्क्रिप्ट टाइमर के माध्यम से "इस" ऑब्जेक्ट के पारित होने को सक्षम करें var __nativeST__ = window.setTimeout, __nativeSI__ = window.setInterval; window.setTimeout = फ़ंक्शन (vCallback, nDelay /*, ArgumentToPass1, ArgumentToPass2, आदि। */) (var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2); return __nativeST__(vCallbackinstanceof Function ? function () ( vCallback.apply(oThis, aArgs); ) : vCallback, nDelay); window.setInterval = function (vCallback, nDelay /*, ArgumentToPass1, ArgumentToPass2, आदि। */) (var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2); return __nativeSI__(vCallbackinstanceof Function ? function () ( vCallback.apply(oThis, aArgs); ) : vCallback, nDelay);

ये दो प्रतिस्थापन IE में टाइमर के कॉलबैक फ़ंक्शन के लिए मनमाने तर्कों के HTML5 मानक मार्ग को भी सक्षम करते हैं। अत: इनका उपयोग इस प्रकार किया जा सकता है गैर-मानक-अनुपालकपॉलीफ़िल भी. ए के लिए देखें मानक अनुरूपपॉलीफ़िल।

नई सुविधा परीक्षण:

MyArray = ["शून्य", "एक", "दो"]; myArray.myMethod = फ़ंक्शन (sProperty) ( चेतावनी(arguments.length > 0 ? यह : यह); ); सेटटाइमआउट (अलर्ट, 1500, "हैलो वर्ल्ड!"); // सेटटाइमआउट और सेटइंटरवल का मानक उपयोग संरक्षित है, लेकिन... setTimeout.call(myArray, myArray.myMethod, 2000); // 2 सेकंड के बाद "शून्य, एक, दो" प्रिंट करता है setTimeout.call(myArray, myArray.myMethod, 2500, 2); // 2.5 सेकंड के बाद "दो" प्रिंट करता है

इसके अधिक जटिल लेकिन फिर भी मॉड्यूलर संस्करण के लिए ( डेमन) जावास्क्रिप्ट डेमन्स मैनेजमेंट देखें। यह अधिक जटिल संस्करण और कुछ नहीं बल्कि तरीकों का एक बड़ा और स्केलेबल संग्रह है डेमननिर्माता. हालांकि डेमनकंस्ट्रक्टर स्वयं एक क्लोन के अलावा और कुछ नहीं है मिनीडेमनके लिए अतिरिक्त समर्थन के साथ इस मेंऔर प्रारंभके आरंभ के दौरान घोषित किए गए फ़ंक्शन डेमन. इतना मिनीडेमनसरल एनिमेशन के लिए फ्रेमवर्क अनुशंसित तरीका बना हुआ है, क्योंकि डेमनइसके तरीकों के संग्रह के बिना यह अनिवार्य रूप से इसका एक क्लोन है।

minidamon.js /*\ |*| |*| :: मिनीडेमन:: |*| |*| संशोधन #2 - 26 सितंबर 2014.सेटइंटरवल |*| https://साइट/उपयोगकर्ता:फ्यूजनचेस |*| https://github.com/madmurphy/minidamon.js |*| |*| यह फ्रेमवर्क जीएनयू लेसर जनरल पब्लिक लाइसेंस, संस्करण 3 या बाद के संस्करण के तहत जारी किया गया है। |*| http://www.gnu.org/licenses/lgpl-3.0.html |*| \*/ फ़ंक्शन MiniDaemon (oOwner, fTask, nRate, nLen) ( if (!(यह && MiniDaemon का यह उदाहरण)) ( return; ) if (arguments.length< 2) { throw new TypeError("MiniDaemon - पर्याप्त नहींतर्क"); ) अगर (ओमालिक) (यह.मालिक = ओमालिक; ) यह.कार्य = एफटास्क; अगर (isFinite(nRate) && nRate > 0) ( this.rate = Math.floor(nRate); ) अगर (nLen > 0) ( this.length = Math.floor(nLen); ) ) MiniDaemon.prototype.task = null; MiniDaemon.prototype.rate = 100; / MiniDaemon.prototype.SESSION = -1; MiniDaemon.prototype.INDEX = 0; MiniDaemon.prototype.BACKW = true; .forceCall = function (oDmn) (oDmn.INDEX += ? -1: 1; यदि (oDmn.task.call(oDmn.owner, oDmn.INDEX, oDmn.length, oDmn.BACKW) === false || oDmn.isAtEnd()) ( oDmn.pause(); वापसी गलत; ) सत्य लौटें ); /* इंस्टेंस विधियां */ MiniDaemon.prototype.isAtEnd = function () (यह वापस करें।< 1: this.INDEX + 1 >यह.लंबाई; ); MiniDaemon.prototype.synchronize = function() ( if (this.PAUSED) ( return; ) ClearInterval(this.SESSION); this.SESSION = setInterval(MiniDaemon.forceCall, this.rate, this); ); MiniDaemon.prototype.pause = function() ( ClearInterval(this.SESSION); this.PAUSED = true; ); MiniDaemon.prototype.start = function (bRevers) ( var bBackw = Boolean(bRevers); if (this.BACKW === bBackw && (this.isAtEnd() || !this.PAUSED)) ( return; ) this.BACKW = bBackw; this.PAUSED = false;

MiniDaemon कॉलबैक फ़ंक्शन के लिए तर्क पारित करता है। यदि आप उन ब्राउज़रों के साथ इस पर काम करना चाहते हैं जो मूल रूप से इस सुविधा का समर्थन नहीं करते हैं, तो ऊपर प्रस्तावित तरीकों में से एक का उपयोग करें।

वाक्य - विन्यास

var myDaemon = नया MiniDaemon( यहऑब्जेक्ट, वापस बुलाओ[ , दर [, लंबाई]]);

विवरण उपयोग नोट्स

सेटइंटरवल() फ़ंक्शन का उपयोग आमतौर पर एनिमेशन जैसे बार-बार निष्पादित होने वाले फ़ंक्शंस के लिए विलंब सेट करने के लिए किया जाता है। आप windowOrWorkerGlobalScope.clearInterval() का उपयोग करके अंतराल को रद्द कर सकते हैं।

यदि आप चाहते हैं कि आपका फंक्शन बुलाया जाए एक बारनिर्दिष्ट विलंब के बाद, उपयोग करें।

विलंब प्रतिबंध

अंतरालों को नेस्ट किया जाना संभव है; अर्थात्, setInterval() के लिए कॉलबैक बदले में एक और अंतराल चालू करने के लिए setInterval() को कॉल कर सकता है, भले ही पहला अंतराल अभी भी चल रहा हो। इसके संभावित प्रभाव को कम करने के लिए प्रदर्शन, एक बार जब अंतराल पांच स्तरों से अधिक गहरा हो जाता है, तो ब्राउज़र स्वचालित रूप से अंतराल के लिए 4 एमएस न्यूनतम मान लागू करेगा, सेटइंटरवल() में गहराई से नेस्टेड कॉल में 4 एमएस से कम मूल्य निर्दिष्ट करने का प्रयास 4 एमएस पर पिन किया जाएगा।

ब्राउज़र कुछ परिस्थितियों में अंतराल के लिए और भी अधिक कठोर न्यूनतम मान लागू कर सकते हैं, हालाँकि ये सामान्य नहीं होने चाहिए। यह भी ध्यान दें कि कॉल से कॉलबैक के बीच व्यतीत होने वाला वास्तविक समय दी गई देरी से अधिक लंबा हो सकता है; उदाहरण के लिए windowOrWorkerGlobalScope.setTimeout() में निर्दिष्ट से अधिक देरी के कारण देखें।

सुनिश्चित करें कि निष्पादन अवधि अंतराल आवृत्ति से कम है

यदि ऐसी संभावना है कि आपके तर्क को निष्पादित होने में अंतराल समय से अधिक समय लग सकता है, तो यह अनुशंसा की जाती है कि आप setTimeout() का उपयोग करके नामित फ़ंक्शन को पुनरावर्ती रूप से कॉल करें। उदाहरण के लिए, यदि हर 5 सेकंड में एक दूरस्थ सर्वर को पोल करने के लिए setInterval() का उपयोग किया जाता है, तो नेटवर्क विलंबता, एक अनुत्तरदायी सर्वर और कई अन्य समस्याएं अनुरोध को उसके आवंटित समय में पूरा होने से रोक सकती हैं। इस प्रकार, आप अपने आप को कतारबद्ध XHR अनुरोधों के साथ पा सकते हैं जो आवश्यक रूप से क्रम में वापस नहीं आएंगे।

प्रोग्रामिंग में स्क्रिप्टिंग भाषाएँसमय-समय पर एक विराम बनाने की आवश्यकता होती है - कार्यक्रम के निष्पादन को कुछ समय के लिए रोकें, और फिर काम करना जारी रखें। उदाहरण के लिए, VBS और PHP स्क्रिप्ट में निम्नलिखित विधियाँ संभव हैं:

वीबीएस: wscript.sleep 1500 (1.5 सेकंड के लिए रुकें)

PHP: नींद(10); (10 सेकंड के लिए रुकें)

ऐसे ठहराव के दौरान, रनटाइम सिस्टम (PHP या VBS) कुछ नहीं कर रहे. जावास्क्रिप्ट में किसी समान चीज़ का सहजता से उपयोग करने का प्रयास करने वाला डेवलपर अप्रिय रूप से आश्चर्यचकित हो जाएगा। सामान्य गलतीजावास्क्रिप्ट में विराम बनाने का प्रयास करते समय यह इस तरह दिखता है:

फ़ंक्शन बैडटेस्ट() (for (var i=1; i< 10; i++) { window.setTimeout("document.getElementById("test1").value += " + i, 900) } }

आप सोचते हैं कि जब, लूप के दौरान, अगला नंबर खींचने की बारी आती है, तो आपका सेटटाइमआउट ईमानदारी से जावास्क्रिप्ट को काम करने से रोक देगा, 0.9 सेकंड प्रतीक्षा करें, इनपुट फ़ील्ड के अंत में वांछित संख्या जोड़ें और फिर काम करना जारी रखें। लेकिन वास्तव में यह सच नहीं है: जावास्क्रिप्ट में सेटइंटरवल और सेटटाइमआउट केवल कोष्ठक में निर्दिष्ट क्रिया (या फ़ंक्शन) के निष्पादन में देरी करते हैं। हमारे उदाहरण में, निम्नलिखित होगा:

  • मैं = 1;
  • इनपुट फ़ील्ड में संख्या "1" जोड़ने में 0.9 सेकंड की देरी;
  • इस समस्या को सेट करने के तुरंत बाद, चक्र जारी रहता है: i=2;
  • इनपुट फ़ील्ड में संख्या "2" जोड़ने में 0.9 सेकंड की देरी;
  • तत्काल का अर्थ है, उदाहरण के लिए, 1 एमएस (अर्थात, 900 एमएस की तुलना में बहुत छोटा): लूप अपना काम लगभग तुरंत करेगा, जिससे एक ही समय में कई स्थगित कार्य बनेंगे। इसका मतलब यह है कि सभी लंबित "ड्राइंग" कार्य लगभग एक ही समय में पूरे हो जाएंगे, नए नंबर जोड़ने के बीच बिना रुके। चक्र शुरू होता है; 0.9 सेकंड के लिए सब कुछ रुक जाता है; और शिर्र - सभी नंबरों को एक के बाद एक पंक्ति में शूट किया जाता है।

    ऐसे मामले में सेटटाइमआउट को सही तरीके से कैसे लागू करें? यह जटिल है। आपको फ़ंक्शन को कॉल करना होगा रिकर्सिवली(फ़ंक्शन के भीतर से वही फ़ंक्शन), और ताकि यह प्रक्रिया अंतहीन न हो, एक रुकने की स्थिति निर्धारित करें (उदाहरण के लिए, मुद्रित होने वाली संख्या का आकार):

    फ़ंक्शन वेलटेस्ट() (यदि (i< 9) { document.getElementById("test2").value += ++i window.setTimeout("welltest()", 400) } }

    और वेरिएबल i को फ़ंक्शन के बाहर प्रारंभ करना होगा - उदाहरण के लिए, इस तरह:

    अब सब कुछ वैसे ही काम करता है जैसे उसे करना चाहिए (हमने विलंब समय को 0.9 सेकेंड से घटाकर 0.4 सेकेंड कर दिया है)। लेकिन ऐसे कार्यों के लिए, सेटटाइमआउट के बजाय सेटइंटरवल का उपयोग करना अधिक तर्कसंगत है (हालांकि इसके लिए दो कार्यों की आवश्यकता होगी):

    फ़ंक्शन बेस्टटेस्ट() ( window.i = 0 window.timer1 = window.setInterval("draw()", 400) ) फ़ंक्शन ड्रा() ( document.getElementById("test3").value += ++i if (i >=9) क्लियरइंटरवल(विंडो.टाइमर1) )

    जावास्क्रिप्ट सेटइंटरवल विधि की ख़ासियत यह है कि यह "स्वयं" पास नहीं होती है, इसे एक विशेष क्लियरइंटरवल विधि से रोका जाना चाहिए। और यह स्पष्ट करने के लिए कि वास्तव में क्या रोकना है, स्थगित कार्रवाई के लिए कार्य को एक विशेष पहचानकर्ता - एक टाइमर सौंपा गया है: window.timer1 = window.setInterval(...) ।

    पहचानकर्ताओं को सेटटाइमआउट विधि द्वारा बनाए गए कार्यों को भी सौंपा जा सकता है। सभी टाइमर आईडी एक दूसरे से अलग होनी चाहिए (वर्तमान ब्राउज़र विंडो के भीतर अद्वितीय)। फिर आप विंडो में कई अलग-अलग कार्य बना सकते हैं जो स्थगित क्रियाओं का उपयोग करते हैं, और इन कार्यों को समानांतर में निष्पादित किया जाएगा (एक साथ, यदि कंप्यूटर में पर्याप्त संसाधन हैं), जो मूल रूप से PHP या VBS में असंभव है।

    यहां एक पृष्ठ का उदाहरण दिया गया है जिसमें कई जावास्क्रिप्ट टाइमर एक साथ चल रहे हैं: setinterval.htm(जावास्क्रिप्ट फ़ाइल में कार्य करता है setinterval.js). सभी पेज टाइमर (मेनू को छोड़कर) को Esc कुंजी का उपयोग करके रोका जा सकता है। सभी उदाहरण टाइमर "प्राकृतिक" (और अमूर्त i++ नहीं) उलटी गिनती पर आधारित हैं - समय या दूरी। सभी "घड़ियाँ" विशेष रूप से डीसिंक्रनाइज़ की गई हैं (स्पष्टता के लिए)। दूरी-निर्भर टाइमर का उपयोग "संकेतक" और ड्रॉप-डाउन ("पुल-आउट") मेनू में किया जाता है।

    ड्रॉप डाउन मेनू

    हमारा स्लाइडिंग मेनू वास्तव में ("हेडर" के नीचे से) स्लाइडिंग है: तत्वों के बीच विशेष रूप से अंतराल छोड़ा जाता है ताकि आप देख सकें कि यह कैसे स्लाइड करता है। अप्रत्याशित रूप से, यह पता चला कि हम अलग-अलग लंबाई की सूचियों के लिए समान रूप से सहज निकास नहीं बना सके - शायद कंप्यूटर के कम प्रदर्शन के कारण ( एएमडी एथलॉन 999 मेगाहर्ट्ज)।

    यह बिल्कुल स्पष्ट है कि सुंदरता और सद्भाव के लिए यह आवश्यक है कि विभिन्न मेनू आइटमों की सूचियाँ एक ही समय में दिखाई दें। यानी, लंबी सूचियां और अधिक के साथ बाहर हो जानी चाहिए उच्च गति, छोटे वाले - कम गति पर। ऐसा प्रतीत होता है कि इसे इस प्रकार कार्यान्वित किया जा सकता है:

  • हमने कुल "प्रस्थान" समय निर्धारित किया है, उदाहरण के लिए, 200 एमएस।
  • यदि ड्रॉपडाउन सूची की ऊंचाई 20 px है, तो यह स्पष्ट है कि हम इसे प्रति 10 एमएस अंतराल पर एक पिक्सेल नीचे ले जा सकते हैं - और फिर 200 एमएस में पूरी सूची सामने आ जाएगी।
  • यदि ड्रॉपडाउन 40px ऊंचा है, तो समान समय में फिट होने के लिए हमें इसे हर 5ms में एक पिक्सेल नीचे ले जाना होगा।
  • इस तर्क के अनुसार, यदि ड्रॉपडाउन सूची 200px ऊंची है, तो हमें इसे प्रत्येक 1ms में एक पिक्सेल नीचे ले जाना चाहिए। लेकिन ऐसी गति हमारे कंप्यूटर पर काम नहीं करती - ब्राउज़र के पास एक मिलीसेकंड में सूची की नई स्थिति खींचने का समय नहीं होता है। हाँ। जावास्क्रिप्ट गिनने का प्रबंधन करता है (गिनने के लिए क्या है?), लेकिन ब्राउज़र (फ़ायरफ़ॉक्स) के पास प्रदर्शित करने का समय नहीं है। वेब के लिए विशिष्ट स्थिति.

    इसलिए, केवल बैसाखी की मदद से मेनू प्रस्थान समय को कम या ज्यादा बराबर करना संभव है, और यह अभी भी स्पष्ट नहीं है कि यह अधिक के लिए कैसे काम करेगा तेज़ कंप्यूटर. लेकिन हमें सबसे धीमे वाले पर भरोसा करना चाहिए, है ना? एल्गोरिथ्म (कंप्यूटर की गति को ध्यान में रखे बिना) कुछ इस तरह निकलता है:

  • सूची की जाँच के लिए कुल समय निर्धारित करें: समय = 224 (एमएस)।
  • हम चक्र में एक अंतराल के लिए न्यूनतम समय निर्धारित करते हैं: विलंब = 3 (एमएस)।
  • सूची को स्थानांतरित करने के लिए न्यूनतम चरण निर्धारित करें: ऑफसेट = 1 (पीएक्स)।
  • हम सूची की ऊंचाई के आधार पर यह सब बदलते हैं: 1) विलंब (अंतराल) समय को ऊंचाई के विपरीत अनुपात में और कुल समय समय के सीधे आनुपातिक में बढ़ाएं (224 की ऊंचाई पर गुणांक 1 है); 2) यदि ऊंचाई 40 पीएक्स से अधिक है, तो ऊंचाई के अनुपात में न्यूनतम कदम बढ़ाएं। सबसे धीमे कंप्यूटर के लिए प्रयोगात्मक रूप से स्थिरांक "40" प्राप्त किया गया था। पेंटियम 4 सीपीयू 2.53 गीगाहर्ट्ज़ कंप्यूटर पर परीक्षणों से बिल्कुल वही संख्या सामने आई - 40। अन्यथा, टाइमर क्रम से बाहर हो जाते हैं, सूचियाँ क्रम से बाहर हो जाती हैं।
  • अब कमोबेश सूचियां सामने आ रही हैं. कमोबेश ऐसे ही समय के लिए. पेज पर setinterval.htm.

    और यहाँ ब्रूस आता है:

    फ़ंक्शन स्लाइड_डू(ओबीजे, मैक्सटॉप, ऑफसेट) (यदि (गेटटॉपलेफ्ट(ओबीजे).टॉप< maxtop) { obj.style.top = getTopLeft(obj).top + offset } else { if (obj && obj.timer1) { clearInterval(obj.timer1) obj.timer1 = null } } }

    फ़ंक्शन स्वयं, जो नेस्टेड सूचियों को मेनू से बाहर धकेलता है, जैसा कि हम देख सकते हैं, बहुत सरल है। जो कुछ बचा है उसे इस पंक्ति के साथ चलाना है:

    Ts.timer1 = setInterval(function())(slide_do(ts, maxtop, offset)), देरी)

    खैर, शुरू करने से पहले, बस इन सभी मैक्सटॉप और ऑफसेट की गणना करें, और सूची को मिंटॉप स्थिति में भी रखें। 40 पंक्तियों का "प्रारंभिक" स्लाइड() फ़ंक्शन यही करता है। और सब एक साथ - एक फ़ाइल में setinterval.js. हाँ, और यह बेकार चीज़ सम्मिलित शैलियाँ फ़ाइल के बिना बिल्कुल भी काम नहीं करेगी



    मित्रों को बताओ