मुझे HTML मार्कअप में <script> टैग कहां लगाना चाहिए?


1487

जावास्क्रिप्ट को HTML दस्तावेज़ में एम्बेड करते समय, <script>टैग लगाने और जावास्क्रिप्ट को शामिल करने के लिए उचित स्थान कहाँ है ? मुझे यह याद आता है कि आप इन्हें <head>खंड में रखने वाले नहीं हैं, लेकिन खंड के आरंभ में रखने से <body>भी बुरा है, क्योंकि पृष्ठ पूरी तरह से प्रस्तुत किए जाने से पहले जावास्क्रिप्ट को पार्स करना होगा (या ऐसा कुछ)। यह टैग के लिए एक तार्किक स्थान के रूप में अनुभाग के अंत को छोड़ देता है ।<body><script>

तो, टैग लगाने के लिए सही जगह कहाँ है<script> ?

(यह सवाल संदर्भ इस सवाल का , जिसमें यह सुझाव दिया गया कि जावास्क्रिप्ट समारोह कॉल से ले जाया जाना चाहिए <a>करने के लिए टैग <script>टैग। मैं विशेष रूप से jQuery का उपयोग कर रहा है, लेकिन अधिक सामान्य जवाब भी उपयुक्त हैं।)


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

जवाबों:


1861

यहां तब होता है जब एक ब्राउज़र <script>उस पर टैग के साथ एक वेबसाइट लोड करता है:

  1. HTML पेज प्राप्त करें (जैसे index.html)
  2. HTML पार्स करना शुरू करें
  3. पार्सर <script>एक बाहरी स्क्रिप्ट फ़ाइल को संदर्भित करने वाले टैग का सामना करता है ।
  4. ब्राउज़र स्क्रिप्ट फ़ाइल का अनुरोध करता है। इस बीच, पार्सर आपके पृष्ठ पर अन्य HTML को पार्स करना बंद कर देता है।
  5. कुछ समय बाद स्क्रिप्ट डाउनलोड की जाती है और बाद में निष्पादित की जाती है।
  6. पार्सर शेष HTML दस्तावेज़ को जारी रखता है।

चरण # 4 एक खराब उपयोगकर्ता अनुभव का कारण बनता है। जब तक आप सभी स्क्रिप्ट डाउनलोड नहीं कर लेते, आपकी वेबसाइट मूल रूप से लोड होना बंद हो जाती है। यदि कोई ऐसी चीज़ है जिससे उपयोगकर्ता घृणा करते हैं तो वह किसी वेबसाइट के लोड होने की प्रतीक्षा कर रहा है।

ऐसा क्यों होता है?

कोई भी स्क्रिप्ट अपने स्वयं के HTML को document.write()या अन्य DOM जोड़तोड़ के माध्यम से सम्मिलित कर सकती है । इसका अर्थ यह है कि स्क्रिप्ट डाउनलोड होने और निष्पादित होने से पहले तक पार्सर को इंतजार करना पड़ता है, इससे पहले कि वह बाकी दस्तावेज़ को सुरक्षित रूप से पार्स कर सके। आखिरकार, स्क्रिप्ट दस्तावेज़ में अपना स्वयं का HTML डाल सकती है।

हालाँकि, दस्तावेज़ लोड होते समय अधिकांश JavaScript डेवलपर अब DOM में हेरफेर नहीं करते हैं । इसके बजाय, वे तब तक प्रतीक्षा करते हैं जब तक कि दस्तावेज़ को संशोधित करने से पहले लोड नहीं किया गया हो। उदाहरण के लिए:

<!-- index.html -->
<html>
    <head>
        <title>My Page</title>
        <script src="my-script.js"></script>
    </head>
    <body>
        <div id="user-greeting">Welcome back, user</div>
    </body>
</html>

जावास्क्रिप्ट:

// my-script.js
document.addEventListener("DOMContentLoaded", function() { 
    // this function runs when the DOM is ready, i.e. when the document has been parsed
    document.getElementById("user-greeting").textContent = "Welcome back, Bart";
});

क्योंकि आपके ब्राउज़र को my-script.js नहीं पता है कि दस्तावेज़ को संशोधित नहीं किया जा रहा है जब तक कि इसे डाउनलोड और निष्पादित नहीं किया गया है, तो पार्सर पार्स करना बंद कर देता है।

पुरातन सिफारिश

इस समस्या को हल करने के लिए पुराना तरीका यह था कि <script>टैग्स को अपने नीचे रखें <body>, क्योंकि यह सुनिश्चित करता है कि पार्सर बहुत अंत तक अवरुद्ध न हो।

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

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

आधुनिक दृष्टिकोण

आज, ब्राउज़र स्क्रिप्ट पर asyncऔर deferविशेषताओं का समर्थन करते हैं। ये विशेषताएँ उन ब्राउज़र को बताती हैं जिन्हें स्क्रिप्ट डाउनलोड किए जाने के दौरान पार्स करना जारी रखना सुरक्षित है।

async

<script src="path/to/script1.js" async></script>
<script src="path/to/script2.js" async></script>

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

Http://caniuse.com/#feat=script-async के अनुसार , सभी ब्राउज़रों का 97.78% इसका समर्थन करते हैं।

आस्थगित करें

<script src="path/to/script1.js" defer></script>
<script src="path/to/script2.js" defer></script>

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

Async स्क्रिप्ट के विपरीत, पूरे दस्तावेज़ लोड होने के बाद ही defer स्क्रिप्ट निष्पादित की जाती हैं।

Http://caniuse.com/#feat=script-defer के अनुसार , सभी ब्राउज़रों में से 97.79% इसका समर्थन करते हैं। 98.06% इसे कम से कम आंशिक रूप से समर्थन करते हैं।

ब्राउज़र संगतता पर एक महत्वपूर्ण नोट: कुछ परिस्थितियों में IE <= 9 आर्डर से हटाई गई स्क्रिप्ट को निष्पादित कर सकता है। यदि आपको उन ब्राउज़रों का समर्थन करने की आवश्यकता है, तो कृपया इसे पहले पढ़ें !

निष्कर्ष

वर्तमान अत्याधुनिक कला को स्क्रिप्ट को <head>टैग में रखना asyncया deferविशेषताओं का उपयोग करना है। यह आपके लिपियों को आपके ब्राउज़र को अवरुद्ध किए बिना डाउनलोड करने की अनुमति देता है।

अच्छी बात यह है कि आपकी वेबसाइट को अभी भी उन 2% ब्राउज़रों पर सही तरीके से लोड होना चाहिए जो अन्य 98% की गति प्राप्त करते समय इन विशेषताओं का समर्थन नहीं करते हैं।


63
मुझे आश्चर्य है कि किसी ने भी Google की व्याख्या का हवाला नहीं दिया ... Developers.google.com/speed/docs/insights/BlockingJS
Casey Falk

6
मैं इस बात पर स्पष्ट नहीं हूं कि DOM क्या छूता है और क्या नहीं। क्या आप स्पष्ट कर सकते हो? क्या jquery.js जैसी किसी चीज़ पर एसिंक्स लोड करना सुरक्षित है?
डग

7
उदाहरण के लिए @ डॉग document.writeडोम पर काम करता है। यह सवाल नहीं है कि क्या कोई स्क्रिप्ट डोम में हेरफेर करती है, लेकिन जब यह होता है। जब तक domreadyघटना के बाद सभी डोम हेरफेर होता है , तब तक आप ठीक हैं। jQuery एक पुस्तकालय है, और इस तरह से नहीं है - या खुद से डोम में हेरफेर करना चाहिए।
बार्ट

24
यह उत्तर भ्रामक है। आधुनिक ब्राउज़र तब पार्स करना बंद नहीं करते हैं जब वे एक तुल्यकालिक स्क्रिप्ट टैग तक पहुंचते हैं जो HTML को प्रभावित कर सकते हैं, वे बस रेंडर करना / निष्पादित करना बंद कर देते हैं, और अन्य संसाधनों को डाउनलोड करने के लिए आशावादी रूप से पार्स करना जारी रखते हैं जो संभवतः बाद में अनुरोध किया जाएगा यदि कोई HTML प्रभावित नहीं होता है।
फैबियो बेल्ट्रामिनी

40
कहीं asyncऔर deferविशेषताओं और गुणों का उपयोग क्यों नहीं किया जाता है? मेरा मतलब है, मैंने इंटरनेट से बहुत सारे HTML स्रोतों को देखा, और मुझे कहीं भी asyncऔर deferविशेषताओं को नहीं देखा । ...?
जॉन सीजे

239

समापन बॉडी टैग से ठीक पहले, जैसा कि कहा गया है

http://developer.yahoo.com/performance/rules.html#js_bottom

तल पर लिपियों रखो

स्क्रिप्ट के कारण समस्या यह है कि वे समानांतर डाउनलोड ब्लॉक करते हैं। HTTP / 1.1 विनिर्देश बताता है कि ब्राउज़र होस्टनाम प्रति समानांतर में दो से अधिक घटकों को डाउनलोड नहीं करते हैं। यदि आप कई होस्टनाम से अपनी छवियों की सेवा करते हैं, तो आप समानांतर में होने के लिए दो से अधिक डाउनलोड प्राप्त कर सकते हैं। हालांकि एक स्क्रिप्ट डाउनलोड हो रही है, हालांकि, ब्राउज़र अलग होस्टनाम पर भी कोई अन्य डाउनलोड शुरू नहीं करेगा।


7
अवधारणा और इसके स्पष्टीकरण से सहमत हैं। लेकिन अगर उपयोगकर्ता पेज के साथ खेलना शुरू कर दे तो क्या होगा। मान लीजिए कि मैंने AJAX ड्रॉपडाउन किया है जो पेज उपयोगकर्ता को दिखाई देने के बाद लोड करना शुरू कर देगा लेकिन लोड करते समय उपयोगकर्ता इसे क्लिक करता है! और क्या होगा अगर एक 'वास्तव में अधीर' उपयोगकर्ता फॉर्म जमा करता है?
हेमंत टैंक

9
@ पुरानी टिप्पणी है, लेकिन आप फ़ील्ड को डिफ़ॉल्ट रूप से अक्षम करने की चाल को तब कर सकते हैं जब उन्हें DOM पूरी तरह लोड होने पर JS का उपयोग करने में सक्षम बनाता है। यही आजकल फेसबुक करता दिख रहा है।
नौवेटो

2
बस क्रोम के साथ यह परीक्षण किया गया है, यह जांचने के लिए कि क्या यह अभी भी समान है। यह है। आप यहां अपने ब्राउज़र के पेज लोड समय में अंतर देख सकते हैं। stevesouders.com/cuzillion
बीजलेख

46
यदि यह सबसे अच्छा अभ्यास है, तो स्टैक ओवरफ्लो <head> में उनके सभी स्क्रिप्ट टैग शामिल क्यों हैं? :-P
फिलिप ०

10
कुछ मामलों में, विशेष रूप से अजाक्स भारी साइटों में, सिर में लोड करने से वास्तव में तेज लोड समय हो सकता है। देखें: encosia.com/dont-let-jquerys-document-ready-slow-you-down (ध्यान दें कि "लाइव ()" फ़ंक्शन jquery में पदावनत है, लेकिन लेख अभी भी "ऑन" () "या" के साथ लागू होता है प्रतिनिधि "समारोह)। <Head> में लोडिंग सही व्यवहार की गारंटी देने के लिए भी आवश्यक हो सकती है जैसा कि @Hermant द्वारा बताया गया है। अंत में, modernizr.com/docs अपनी साइट पर बताई गई वजहों से इसकी स्क्रिप्ट को <head> में रखने की सलाह देती है।
नाथन

76

नॉन-ब्लॉकिंग स्क्रिप्ट टैग को कहीं भी रखा जा सकता है:

<script src="script.js" async></script>
<script src="script.js" defer></script>
<script src="script.js" async defer></script>
  • async उपलब्ध होते ही स्क्रिप्ट को एसिंक्रोनस रूप से निष्पादित किया जाएगा
  • defer स्क्रिप्ट निष्पादित किया जाता है जब दस्तावेज़ ने पार्स करना समाप्त कर दिया है
  • async defer यदि एसिंक्स समर्थित नहीं है तो स्क्रिप्ट वापस डिफर के व्यवहार में आ जाती है

ऐसी स्क्रिप्ट्स को अतुल्यकालिक रूप से निष्पादित किया जाएगा / दस्तावेज तैयार होने के बाद, जिसका अर्थ है कि आप ऐसा नहीं कर सकते:

<script src="jquery.js" async></script>
<script>jQuery(something);</script>
<!--
  * might throw "jQuery is not defined" error
  * defer will not work either
-->

या यह:

<script src="document.write(something).js" async></script>
<!--
  * might issue "cannot write into document from an asynchronous script" warning
  * defer will not work either
-->

या यह:

<script src="jquery.js" async></script>
<script src="jQuery(something).js" async></script>
<!--
  * might throw "jQuery is not defined" error (no guarantee which script runs first)
  * defer will work in sane browsers
-->

या यह:

<script src="document.getElementById(header).js" async></script>
<div id="header"></div>
<!--
  * might not locate #header (script could fire before parser looks at the next line)
  * defer will work in sane browsers
-->

कहा गया है कि, अतुल्यकालिक स्क्रिप्ट ये लाभ प्रदान करती हैं:

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

कॉलबैक का समर्थन करने वाली बाहरी स्क्रिप्ट का उपयोग करके निष्पादन आदेश के मुद्दों को दरकिनार करना संभव है। कई तृतीय पक्ष जावास्क्रिप्ट एपीआई अब गैर-अवरुद्ध निष्पादन का समर्थन करते हैं। यहां Google मैप्स एपीआई को अतुल्यकालिक रूप से लोड करने का एक उदाहरण है ।


2
यह आज के लिए सही उत्तर है - इस दृष्टिकोण का उपयोग करने का मतलब है कि अपने विजेट को स्वयं को रखना आसान है, फैंसी को <head>तर्क करने की आवश्यकता नहीं है।
डैनियल सोकोलोव्स्की

1
मैं उलझन में हूँ तुम क्यों उपयोग नहीं कर सकते asyncया deferरूप में आप अपने दूसरे खंड में निर्दिष्ट जब jQuery सहित: <script src="jquery.js" async></script>। क्या आप समझाने में सक्षम हैं कि क्यों? मुझे लगा कि मुझे स्वीकार किए गए उत्तर के अनुसार async टैग की आवश्यकता है - इसलिए मेरा पेज लोड हो सकता है जबकि jQuery अभी भी लोड हो रहा है]। धन्यवाद!
elbowlobstercowstand

3
पेज पर कहीं भी @elbow 99% बार <script src=jquery.js>है $(function(){ ... })। अतुल्यकालिक लोडिंग की गारंटी नहीं है कि jQuery को लोड किया जाएगा समय ब्राउज़र उन ब्लॉकों को पार्स करने की कोशिश करता है इसलिए यह $ उठाएगा परिभाषित त्रुटि नहीं है (यदि कैश से jQuery लोड किया गया था तो आपको त्रुटि नहीं मिल सकती है)। मैंने jQuery को अतुल्यकालिक और संरक्षित करने के बारे में एक सवाल का जवाब दिया $(function(){ ... })। मैं देखूंगा कि क्या मुझे मिल सकता है, या आप इस प्रश्न को देख सकते हैं: stackoverflow.com/q/14811471/87015
सलमान ए

1
@ सलमान धन्यवाद! हां, मैं उस 99% में गिर गया। मुझे पहले jqueryलोड करने के लिए lib की आवश्यकता है , फिर मेरी शेष .jsलिपियों की। जब मैं लिबर स्क्रिप्ट टैग की घोषणा करता हूं asyncया deferकरता jqueryहूं, तो मेरी .jsस्क्रिप्ट काम नहीं करती है। मैंने सोचा कि $(function(){ ... })संरक्षित - नहीं लगता है। वर्तमान समाधान: मैं लिपि deferया लिपि asyncपर नहीं जोड़ता jquery, लेकिन मैं asyncअपने अनुवर्ती .jsलिपियों पर जोड़ता हूं । नोट: कारण मैं कर रहा हूँ किसी भी इस के गूगल पृष्ठ गति खुश करने के लिए है। मदद के लिए फिर से thx! किसी भी अन्य सलाह का स्वागत है। (या आपके पिछले उत्तर के लिए एक लिंक)। :)
elbowlobstercowstand 21

@elbow देखें stackoverflow.com/a/21013975/87015 , यह आपको केवल एक विचार देगा लेकिन पूर्ण समाधान नहीं। आप इसके बजाय "jquery async लोडर पुस्तकालयों" के लिए खोज कर सकते हैं।
सलमान ए

38

याहू द्वारा प्रचारित मानक सलाह! असाधारण प्रदर्शन टीम, <script>दस्तावेज़ निकाय के अंत में टैग लगाने के लिए है ताकि वे पृष्ठ के प्रतिपादन को अवरुद्ध न करें।

लेकिन कुछ नए दृष्टिकोण हैं जो बेहतर प्रदर्शन प्रदान करते हैं, जैसा कि Google Analytics जावास्क्रिप्ट फ़ाइल के लोड समय के बारे में इस उत्तर में वर्णित है :

स्टीव साउडर्स (क्लाइंट-साइड प्रदर्शन विशेषज्ञ) द्वारा कुछ शानदार स्लाइड्स के बारे में हैं:

  • समानांतर में बाहरी जावास्क्रिप्ट फ़ाइलों को लोड करने के लिए विभिन्न तकनीकों
  • लोडिंग समय और पृष्ठ रेंडरिंग पर उनका प्रभाव
  • ब्राउज़र किस प्रकार की "प्रगति में" संकेतक प्रदर्शित करता है (जैसे स्टेटस बार में 'लोडिंग', प्रति घंटा माउस कर्सर)।

25

यदि आप JQuery का उपयोग कर रहे हैं, तो जहाँ भी आपको यह सबसे अच्छा लगता है, जावास्क्रिप्ट डालें और यह $(document).ready()सुनिश्चित करने के लिए उपयोग करें कि किसी भी फ़ंक्शन को निष्पादित करने से पहले चीजें ठीक से लोड की गई हैं।

एक साइड नोट पर: मुझे <head>अनुभाग में मेरे सभी स्क्रिप्ट टैग पसंद हैं क्योंकि यह सबसे साफ जगह है।


14
सिर में ... एर? <header>?
डेन लैग

7
ध्यान दें कि $(document).ready()इसका उपयोग करने का मतलब यह नहीं है कि आप अपने जावास्क्रिप्ट को कहीं भी रख सकते हैं - आपको अभी भी इसे वहाँ लगाना है <script src=".../jquery.min.js">जहाँ आप jQuery शामिल करते हैं, इसलिए यह $मौजूद है।
रोरी ओ'केन

2
स्क्रिप्ट टैग्स को <head> सेक्शन में डालना इष्टतम नहीं है - यह पेज के दृश्य भाग के प्रदर्शन में देरी करेगा जब तक स्क्रिप्ट लोड नहीं हो जाती।
साइबरमॉक

नहीं, @, एक headerतत्व HTML दस्तावेज़ सामग्री का हिस्सा है, और दस्तावेज़ के लिए मेटा-डेटा और गैर-सामग्री डेटा के लिए bodyतत्व . The head` टैग के भीतर एक या एक से अधिक बार होना चाहिए । यह इन दिनों है, साथ deferऔर asyncस्क्रिप्ट टैग के लिए एक आदर्श स्थान। headerतत्वों में केवल वह जानकारी होनी चाहिए जो उस दस्तावेज़ के अनुभाग का वर्णन करती है जो उसका अनुसरण करता है।
प्रोके

1
@ProfK, डैन मूल अनएडिटेड प्रश्न का जिक्र कर रहा था जब उसने 4 साल पहले यह पोस्ट किया था। जैसा कि आप देख सकते हैं, सवाल एक साल बाद संपादित किया गया था।
kojow7

18

2019 में आधुनिक दृष्टिकोण ईएस 6 मॉड्यूल प्रकार स्क्रिप्ट का उपयोग कर रहा है

<script type="module" src="..."></script>

डिफ़ॉल्ट रूप से, मॉड्यूल एसिंक्रोनस रूप से लोड किए जाते हैं और स्थगित किए जाते हैं। यानी आप उन्हें कहीं भी रख सकते हैं और जब पृष्ठ लोड हो जाता है तो वे समानांतर और निष्पादित हो जाएंगे।

एक स्क्रिप्ट और एक मॉड्यूल के बीच अंतर यहाँ वर्णित हैं:

https://stackoverflow.com/a/53821485/731548

स्क्रिप्ट की तुलना में मॉड्यूल का निष्पादन यहां वर्णित है:

https://developers.google.com/web/fundamentals/primers/modules#defer

समर्थन यहाँ दिखाया गया है:

https://caniuse.com/#feat=es6-module


जानकारी के आधार पर जोड़ने के लिए अच्छी जानकारी
सागर

1
बस ध्यान दें कि यह काम नहीं करेगा यदि आप अपने स्थानीय फाइल सिस्टम पर बिना सर्वर के सामान भर रहे हैं। Chrome में कम से कम आपको एक क्रॉस-ओरिजिनल त्रुटि मिलती है जो HTML से js को लोड करने की कोशिश कर रही है, भले ही वे दोनों एक ही मूल हों, आपका फाइलसिस्टम।
हिप्पिट्रैसिल

11

यदि स्क्रिप्ट मुख्य तत्व के अलावा कहीं और है तो XHTML मान्य नहीं होगा। यह हर जगह हो सकता है।

आप jQuery जैसी किसी चीज़ के साथ निष्पादन को स्थगित कर सकते हैं, इसलिए यह कोई फर्क नहीं पड़ता कि इसे कहाँ रखा गया है (पार्सिंग के दौरान एक छोटे प्रदर्शन को छोड़कर)।


1
एक्सएचटीएमएल शरीर में स्क्रिप्ट टैग के साथ मान्य होगा, दोनों सख्त और संक्रमणकालीन। स्टाइल टैग हालांकि केवल सिर में हो सकते हैं।
इव्रीस

11
<script src="myjs.js"></script>
</body>

स्क्रिप्ट टैग का उपयोग हमेशा शरीर के करीब या HTML फ़ाइल में बॉटम से पहले किया जाना चाहिए ।

तब आप js फ़ाइल लोड करने से पहले पृष्ठ की सामग्री देख सकते हैं ।

यदि आवश्यक हो तो यह जांचें: http://stevesouders.com/hpws/rule-js-bottom.php


2
यह वास्तव में सवाल का जवाब दिया। मैं सोच रहा था कि पोस्ट किए गए लगभग सभी उदाहरणों ने "पृष्ठ के अंत" का उचित दृश्य संदर्भ कभी नहीं दिया
केन इंग्राम

1
यह उत्तर बहुत ही भ्रामक है और शायद सबसे गलत है। Google और MDN के लेखों से पता चलता है कि सिंक्रोनस JS (जो कि यहाँ मामला है) हमेशा DOM निर्माण और पार्सिंग को अवरुद्ध करता है जिसके परिणामस्वरूप पहले रेंडर करने में देरी होगी। इसलिए, जब तक जेएस फाइल नहीं आती है तब तक आप पेज की सामग्री को नहीं देख सकते हैं और जब तक आप HTML दस्तावेज़ में अपनी जेएस फाइल को सिंक्रोनाइज़ नहीं करते हैं, तब तक क्रियान्वित नहीं करते हैं
लिंगराजू ईवी

यह 2009 में किए गए बिंदुओं को भी संदर्भित करता है और अब प्रासंगिक नहीं है।
टॉक्सिक

7

पारंपरिक (और व्यापक रूप से स्वीकार किया गया) उत्तर "सबसे नीचे" है, क्योंकि तब कुछ भी निष्पादित करना शुरू करने से पहले पूरे डोम को लोड किया गया होगा।

अलग-अलग कारणों से असंतुष्ट हैं, उपलब्ध अभ्यास के साथ जानबूझकर पृष्ठ ऑनलोड घटना के साथ निष्पादन शुरू करते हैं।


6

डाल करने के लिए सबसे अच्छी जगह <script>टैग बंद करने से पहले है </body>टैग , तो डाउनलोड करने और क्रियान्वित यह दस्तावेज़ में एचटीएमएल पार्स करने के लिए ब्राउज़र ब्लॉक नहीं करता,

इसके अलावा js फ़ाइलों को बाहर उसके अपने फायदे है लोड हो रहा है ऐसा लगता है कि हो जाएगा ब्राउज़रों द्वारा कैश और कर सकते हैं पेज लोड समय की गति है, यह और JavaScript कोड को अलग करती है और कोड बेस बेहतर प्रबंधन करने के लिए मदद की

लेकिन आधुनिक ब्राउज़र कुछ अन्य इष्टतम तरीकों का भी समर्थन करते हैं जैसे कि asyncऔर deferबाहरी javascriptफ़ाइलों को लोड करना ।

Async और Defer

आम तौर पर HTML पेज निष्पादन लाइन द्वारा लाइन शुरू होता है। जब एक बाहरी जावास्क्रिप्ट तत्व का सामना करना पड़ता है, तो HTML पार्स करना बंद कर दिया जाता है जब तक कि जावास्क्रिप्ट डाउनलोड और निष्पादन के लिए तैयार न हो। यह सामान्य पृष्ठ निष्पादन का उपयोग deferऔर asyncविशेषता को बदला जा सकता है ।

Defer

जब एक डीफ़र्ट विशेषता का उपयोग किया जाता है, तो जावास्क्रिप्ट को HTML पार्सिंग के साथ समानांतर रूप से डाउनलोड किया जाता है, लेकिन पूर्ण HTML पार्स करने के बाद ही निष्पादित किया जाएगा।

<script src="/local-js-path/myScript.js" defer></script>

Async

जब async विशेषता का उपयोग किया जाता है, तो स्क्रिप्ट डाउनलोड होते ही जावास्क्रिप्ट डाउनलोड किया जाता है और डाउनलोड होने के बाद, इसे HTML पार्सिंग के साथ एसिंक्रोनसली (समानांतर रूप से) निष्पादित किया जाएगा।

<script src="/local-js-path/myScript.js" async></script>

कब कौन सी विशेषताओं का उपयोग करें

  • यदि आपकी स्क्रिप्ट अन्य स्क्रिप्ट से स्वतंत्र है और मॉड्यूलर है, तो उपयोग करें async
  • यदि आप script1 और script2 को लोड कर रहे हैं async, तो दोनों
    HTML पार्सिंग के साथ समानांतर रूप से चलेंगे , जैसे ही वे डाउनलोड
    और उपलब्ध होंगे।
  • यदि आपकी स्क्रिप्ट दूसरी स्क्रिप्ट पर निर्भर करती है तो deferदोनों के लिए उपयोग करें :
  • जब script1 और script2 को उस क्रम में लोड किया जाता है defer, तो script1 को पहले निष्पादित करने की गारंटी दी जाती है,
  • तो script2 पूरी तरह से निष्पादित होने के बाद script2 निष्पादित करेगा।
  • यह करना चाहिए अगर script2 script1 पर निर्भर करता है।
  • यदि आपकी स्क्रिप्ट काफी छोटी है और किसी अन्य प्रकार की स्क्रिप्ट द्वारा निर्भर है, asyncतो अपनी स्क्रिप्ट को बिना किसी विशेषता के उपयोग करें और इसे सभी asyncलिपियों के ऊपर रखें ।

संदर्भ: knowledgehills.com


3

निर्भर करता है, यदि आप एक स्क्रिप्ट लोड कर रहे हैं जो आपके पृष्ठ को स्टाइल करने के लिए आवश्यक है / अपने पृष्ठ में क्रियाओं का उपयोग करना (जैसे एक बटन पर क्लिक करना) तो आप इसे शीर्ष पर रखते हैं। यदि आपका स्टाइल 100% CSS है और आपके पास बटन क्रियाओं के लिए सभी कमबैक विकल्प हैं तो आप इसे नीचे रख सकते हैं।

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


3

अंत में स्क्रिप्ट को शामिल करना मुख्य रूप से उपयोग किया जाता है जहां वेबसाइट की सामग्री / शैलियों को पहले दिखाया जाना है।

सिर में लिपियों सहित लिपियों को जल्दी से लोड करता है और पूरे वेब साइट के लोड होने से पहले इसका उपयोग किया जा सकता है।

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


2

स्क्रिप्ट और इसके उपयोग के आधार पर सबसे अच्छा संभव (पृष्ठ लोड और प्रतिपादन समय के संदर्भ में) एक पारंपरिक <स्क्रिप्ट> -टैग प्रति सेगमेंट का उपयोग नहीं करने के लिए हो सकता है, लेकिन स्क्रिप्ट के लोडिंग को अतुल्यकालिक रूप से गतिशील रूप से ट्रिगर करने के लिए हो सकता है।

कुछ अलग-अलग तकनीकें हैं, लेकिन window.onload इवेंट ट्रिगर होने पर सबसे सीधा फॉरवर्ड document.createElement ("स्क्रिप्ट") का उपयोग करना है। तब स्क्रिप्ट को पहले लोड किया जाता है जब पेज खुद ही रेंडर हो जाता है, इस प्रकार उस समय को प्रभावित नहीं करता है जब उपयोगकर्ता को पेज के आने का इंतजार करना पड़ता है।

यह स्वाभाविक रूप से आवश्यक है कि पृष्ठ के प्रतिपादन के लिए स्क्रिप्ट की आवश्यकता नहीं है।

अधिक जानकारी के लिए, स्टीव सॉडर्स (YSlow के निर्माता लेकिन अब Google पर) द्वारा युग्मन async स्क्रिप्ट देखें ।


2
  • यदि आप अभी भी IE <10 में समर्थन और प्रदर्शन के बारे में बहुत परवाह करते हैं, तो यह हमेशा आपके स्क्रिप्ट को आपके HTML शरीर के अंतिम टैग बनाने के लिए सबसे अच्छा है। इस तरह, आप निश्चित हैं कि बाकी DOM लोड हो चुके हैं और आप ब्लॉक और रेंडर नहीं करेंगे।

  • यदि आप IE <10 के बारे में बहुत अधिक परवाह नहीं करते हैं, तो आप अपनी स्क्रिप्ट को अपने दस्तावेज़ के सिर में रख सकते हैं और deferयह सुनिश्चित करने के लिए उपयोग कर सकते हैं कि वे केवल आपके डोम लोड होने के बाद ही चलते हैं ( <script type="text/javascript" src="path/to/script1.js" defer></script>)। यदि आप अभी भी अपने कोड को IE <10 में काम करना चाहते हैं, तो अपने कोड को एक में लपेटना न भूलें window.onload, हालांकि!


स्वीकृत उत्तर में, इसे "प्राचीन सिफारिश" के रूप में संदर्भित किया जाता है। यदि आप अभी भी इसका मतलब है, आप शायद इसे वापस करने के लिए कुछ संदर्भ का उत्पादन करना चाहिए।
dakab

1

स्क्रिप्ट ब्लॉक डोम लोड को तब तक अनलोड करता है जब उसे लोड और निष्पादित किया जाता है।

यदि आप <body>सभी डोम के अंत में स्क्रिप्ट रखते हैं तो लोड करने और रेंडर करने का मौका है (पेज तेजी से "प्रदर्शित" होगा)। <script>उन सभी डोम तत्वों तक पहुँच प्राप्त करेगा।

दूसरे हाथ में इसे <body>शुरू या ऊपर रखने के बाद स्क्रिप्ट निष्पादित करेगा (जहां अभी भी कोई डोम तत्व नहीं है)।

आप jQuery सहित हैं, जिसका अर्थ है कि आप इसे जहाँ चाहे वहाँ रख सकते हैं और उपयोग कर सकते हैं । ()


1

मुझे लगता है कि यह वेबपेज के निष्पादन पर निर्भर करता है। यदि आप जिस पेज को प्रदर्शित करना चाहते हैं वह पहले जावास्क्रिप्ट लोड किए बिना ठीक से प्रदर्शित नहीं हो सकता है तो आपको पहले जावास्क्रिप्ट फाइल को शामिल करना चाहिए। लेकिन यदि आप शुरू में जावास्क्रिप्ट फ़ाइल डाउनलोड किए बिना वेबपेज प्रदर्शित / रेंडर कर सकते हैं, तो आपको पृष्ठ के नीचे जावास्क्रिप्ट कोड डालना चाहिए। क्योंकि यह एक तेज़ पृष्ठ लोड का अनुकरण करेगा, और उपयोगकर्ता के दृष्टिकोण से ऐसा लगेगा कि यह पृष्ठ तेज़ी से लोड हो रहा है।


1

आप <script>संदर्भ के अंत में अधिकांश जगह रख सकते हैं <body>,
लेकिन यदि आपके पृष्ठ पर सक्रिय घटक हैं जो बाहरी स्क्रिप्ट का उपयोग कर रहे हैं,
तो उनकी निर्भरता (जेएस फाइलें) इससे पहले (आदर्श रूप से हेड टैग में) आनी चाहिए।



-1

HTML दस्तावेज़ के अंत में

ताकि यह निष्पादन के समय ब्राउज़र में HTML दस्तावेज़ को लोड करने पर प्रभाव न डाले।


-1

अपना JavaScriptकोड लिखने के लिए सबसे अच्छी जगह दस्तावेज़ के अंत में या </body>दस्तावेज़ को पहले लोड करने के लिए टैग से पहले और फिर js कोड निष्पादित करना है।

<script> ... your code here ... </script>
</body>

और अगर आप निम्नलिखित में लिखते हैं JQueryतो हेड डॉक्यूमेंट में हो सकता है और यह डॉक्यूमेंट लोड होने के बाद निष्पादित होगा:

<script>
$(document).ready(function(){
   //your code here...
});
</script>

फेंक देता हैSyntaxError
सूबेदार राज

आपका उत्तर गलत नहीं था, लेकिन अद्यतन किए जाने की सख्त जरूरत थी।
पॉल कार्लटन

-2

यह HTML के बाद स्क्रिप्ट को शामिल करने के लिए मुझे अधिक समझ में आता है। क्योंकि मेरी स्क्रिप्ट निष्पादित करने से पहले मुझे लोड करने के लिए अधिकांश समय डोम की आवश्यकता होती है। मैं इसे हेड टैग में रख सकता हूं लेकिन मुझे ओवर लोडिंग के सभी डॉक्यूमेंट लोड करने वाले श्रोता पसंद नहीं हैं। मैं चाहता हूं कि मेरा कोड छोटा और मीठा हो और पढ़ने में आसान हो।

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

वैसे अच्छा सवाल है।


-6

आप वह स्थान रख सकते हैं जहाँ आप स्क्रिप्ट चाहते हैं और एक अन्य अभ्यास से बेहतर नहीं है।

स्थिति इस प्रकार है:

पृष्ठ को रैखिक रूप से, "टॉप-डाउन" लोड किया जाता है, इसलिए यदि आप स्क्रिप्ट को सिर में रखते हैं, तो यह सुनिश्चित करता है कि यह सब कुछ से पहले लोड करना शुरू कर देता है, अब, यदि आप इसे कोड के साथ मिश्रित शरीर के अंदर डालते हैं, तो पृष्ठ लोड एक भद्दा तरीके से हो सकता है।

अच्छे अभ्यास की पहचान कहाँ पर निर्भर नहीं करती है।

आप का समर्थन करने के लिए, मैं निम्नलिखित का उल्लेख करेंगे:

आप जगह कर सकते हैं:

और पृष्ठ रैखिक रूप से लोड होगा

पृष्ठ को अन्य सामग्री के साथ अतुल्यकालिक रूप से लोड किया गया है

पृष्ठ की सामग्री लोड होने के पहले और बाद में लोड हो जाएगी और स्क्रिप्ट लोड हो जाती हैं

यहाँ अच्छा अभ्यास होगा, प्रत्येक कब लागू होगा?

मुझे आशा है कि मैं मददगार रहा हूँ, कुछ भी बस मुझे इस मुद्दे का जवाब।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.