2012-02-21 22 views
7

मैंने देखा है कि कुछ स्क्रिप्ट किसी अन्य पृष्ठ पर दूसरों के सामने बुलाए जाने लगते हैं, मैं सोच रहा था, स्क्रिप्ट लोड करने के लिए विशिष्ट क्रम क्या है? संदर्भित .js स्क्रिप्ट से पहले पृष्ठ में? क्या वे पृष्ठ में अंतिम बार उल्लिखित <script> से क्रम में चल रहे हैं, या यह ब्राउज़र-निर्भर है? कोई यह सुनिश्चित कैसे कर सकता है कि किसी पृष्ठ में एक विशिष्ट स्क्रिप्ट चलाना सबसे पहले हो?सुनिश्चित करें कि जावास्क्रिप्ट स्क्रिप्ट पहले चलाने के लिए है?

उत्तर

4

मैंने देखा है कि कुछ स्क्रिप्ट किसी अन्य पृष्ठ पर दूसरों के सामने बुलाए जाने लगते हैं। मैं सोच रहा था, स्क्रिप्ट लोड करने के लिए विशिष्ट क्रम क्या है?

यह उनकी भाषा विनिर्देशों में डब्ल्यू 3 सी द्वारा निर्धारित है। उदाहरण के लिए, HTML 4.01 Specification के लिए, इसे Section 18.2.4 Dynamic modification of documents, item 1 में परिभाषित किया गया है।

संदर्भित .js स्क्रिप्ट से पहले पृष्ठ में?

ऊपर देखें। नहीं, इनलाइन और लिंक्ड स्क्रिप्ट समान रूप से संभाले जाते हैं।

क्या वे पहले उल्लिखित पृष्ठ, से पहले क्रम में चल रहे हैं या यह ब्राउज़र-निर्भर है?

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

विचार करने की एक और बात "रन" की परिभाषा है। यह अर्थपूर्ण पार्सिंग की तरह लग सकता है, लेकिन यह नहीं है। जावास्क्रिप्ट, किसी भी प्रोग्रामिंग भाषा की तरह, खुद को मानकों के अनुसार व्यवहार करने के लिए डिज़ाइन किया गया है। धारा 7 लेक्सिकल सम्मेलनों में बाएं से दाएं का मूल्यांकन करने के लिए जावास्क्रिप्ट को ECMA-262 5.1 Edition/June 2011 standard में निर्दिष्ट किया गया है। (रेखा के अंत को अगली पंक्ति के बाएं-सबसे चरित्र के रूप में माना जाता है।) यह दस्तावेज़ उस आदेश के लिए सम्मेलन भी प्रदान करता है जिसमें विवरण और अन्य परिचालनों का मूल्यांकन किया जाता है, जैसे WHILE या विवरण के लिए।

कोई यह सुनिश्चित कैसे कर सकता है कि किसी पृष्ठ में एक विशिष्ट स्क्रिप्ट चलाना सबसे पहले हो?

(1) इसे शीर्ष पर रखें, और (2) एक ब्राउज़र चुनें जो भाषा विनिर्देश लागू करता है।

हालांकि, मुझे लगता है कि इस प्रश्न के पीछे कुछ और हो सकता है। यदि आप निष्पादित होने से अप्रत्याशित कोड को रोकने की कोशिश कर रहे हैं, तो आपको इसे तब तक अवरुद्ध करना होगा जब तक कि अपलोड ईवेंट हैंडलर पंजीकृत नहीं करता है कि पृष्ठ पूरा हो गया है। (बस एक ऑपरेशन को अपने फ़ंक्शन में संलग्न करें या उन्हें एक बूलियन ध्वज की जांच करने के लिए IF के साथ घिराएं, यानी अपलोड द्वारा सेट किया गया है।), जब अपलोड ईवेंट हैंडलर बंद हो जाता है, तो आप बिना अपने शेड्यूल पर ऑपरेशन बंद कर सकते हैं uninstantiated डीओएम वस्तुओं की तरह चीजों के बारे में चिंता करने के लिए।

9

जब तक कोई स्क्रिप्ट गतिशील रूप से लोड या एसिंक या डिफर के रूप में चिह्नित नहीं होती है, तब तक पृष्ठ में आने वाले क्रम में स्क्रिप्ट चलाए जाते हैं या मूल्यांकन किए जाते हैं। तो, पहली स्क्रिप्ट पहले दौड़ने का सामना करना पड़ा।

एक बाहरी संदर्भित स्क्रिप्ट फ़ाइल जो लोड की जानी चाहिए, सभी बाहरी जावास्क्रिप्ट निष्पादन का इंतजार तब तक कर देगा जब तक कि बाहरी संदर्भित फ़ाइल लोड नहीं हो जाती है और पार्स किया जाता है और चलाता है।

तो, सामान्य (गैर-एसिंक, गैर-स्थगित) जावास्क्रिप्ट का मूल्यांकन क्रम पृष्ठ में आने वाले क्रम के रूप में 100% निर्धारित है।

+0

कृपया ईसीएमए -262 संस्करण 5+ से इसके लिए एक संदर्भ प्रदान करें जो घोषणा करता है कि मानकों के अनुसार यह निर्दिष्ट व्यवहार है। क्या आप निश्चित हैं कि यह सभी ब्राउज़रों और प्लेटफॉर्म पर इस तरह से काम करता है और यह सिर्फ एक झलक नहीं है? – ingyhere

+0

@ingyhere - मुझे नहीं पता कि इस पर कोई संदर्भ कहां है, मेरे पास अभी देखने का समय नहीं है। यह तरीका जावास्क्रिप्ट काम करता है - अगर आपके पास इसे चुनौती देने का कोई कारण है, तो कृपया उस कारण को बताएं। जावास्क्रिप्ट ऊपर/नीचे से निष्पादित करता है। यह बिल्कुल ब्राउज़र में संगत होना चाहिए या बहुत सारे पेज तोड़ेंगे क्योंकि लोग हर समय ऊपर से नीचे तक जावास्क्रिप्ट पर भरोसा करते हैं। बहुत सी भाषा को कोड के विभिन्न हिस्सों के बीच गारंटीकृत निष्पादन आदेश प्रदान करना पड़ता है क्योंकि अक्सर आपके तर्क को काम करने की आवश्यकता होती है। – jfriend00

+0

यहाँ एक संदर्भ है: http://docstore.mik.ua/orelly/webprog/jscript/ch12_03.htm – jfriend00

5

डिफ़ॉल्ट रूप से, script टैग डाउनलोड किए जाते हैं और क्रमशः मूल्यांकन किए जाते हैं क्योंकि उन्हें HTML दस्तावेज़ में सामना करना पड़ता है।

लेकिन यदि आप async या defer विशेषताओं का उपयोग, निष्पादन होता है या तो स्क्रिप्ट खत्म डाउनलोड करने (async) के बाद या के बाद पृष्ठ को लोड किया जाता है (स्थगित)।

+0

पार्सिंग के बाद तक * डिफर * विशेषता स्टॉलिंग निष्पादन पर भरोसा न करें (अन्यथा यह लोड और तैयार घटनाओं के लिए एक अच्छा विकल्प होगा)। एचटीएमएल 4 में, [डिफर] (http://www.w3.org/TR/html401/interact/scripts.html#adef-defer) केवल एक संकेत था कि स्क्रिप्ट ने सामग्री नहीं बनाई थी ताकि ब्राउजर लोड करना जारी रख सके इसे निष्पादित करते समय। एचटीएमएल 5 में, [defer] (http://www.w3.org/TR/html5/scripting-1.html#attr-script-defer) का अर्थ है "पार्सिंग समाप्त होने तक प्रतीक्षा करें"। एचटीएमएल 5 पर्याप्त रूप से समर्थित नहीं है कि निर्दिष्ट व्यवहार पर भरोसा किया जा सकता है, शायद कुछ वर्षों तक नहीं। – RobG

1

लिपियों को एचटीएमएल फ़ाइल में मूल्यांकन के क्रम में चलाया जाता है, जैसा कि आप इसे ऊपर से पढ़ते हैं।

हालांकि, एसिंक और डिफरर उन ब्राउज़रों के लिए इसे ओवरराइड कर सकते हैं, जिन्हें लागू किया गया है।

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

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