क्या जावास्क्रिप्ट को HTML के शरीर में एम्बेड करना बुरा व्यवहार है?


84

एक टीम जिस पर मैं काम कर रहा हूं <script>, वह हमारे HTML पृष्ठों के शरीर में यादृच्छिक स्थानों पर टैग का उपयोग करने की आदत में बदल गई है । उदाहरण के लिए:

<html>
    <head></head>
    <body>
        <div id="some-div">
            <script type="text/javascript">//some javascript here</script>
        </div>
    </body>
</html>

मैंने ऐसा पहले नहीं देखा था। यह उन कुछ ब्राउज़रों में काम करने लगता है जिन्हें मैंने परीक्षण किया है। लेकिन जहाँ तक मुझे पता है, इस तरह से स्क्रिप्ट टैग लगाना मान्य नहीं है।

क्या मै गलत हु? यह कितना बुरा है कि हम स्क्रिप्ट टैग इस तरह से div टैग के भीतर डाल रहे हैं? क्या कोई ब्राउज़र संगतता समस्याएं हैं जिनके बारे में मुझे पता होना चाहिए?


1
क्या यह document.writesवहां हो रहा है या इसके होने का कोई विशेष कारण नहीं है कि यह कहां है?
मार्टिन स्मिथ

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

@ पर्लज़ - मेरा जवाब देखिए कि यह बुरा क्यों है। बस यहाँ एक जीवन को बचाने की कोशिश कर रहा है। और मैं सही हूँ
जेसन

जवाबों:


88

यह पूरी तरह से वैध है।

आप कोड के बड़े बड़े ब्लॉक को मार्कअप में मिश्रित नहीं करना चाहेंगे (बेहतर बाहरी स्क्रिप्ट का उपयोग करना), लेकिन यह निम्न के लिए उपयोगी हो सकता है:

  • प्रगतिशील-एन्हांसमेंट के लिए अतिरिक्त बाध्यकारी जानकारी जोड़ें (जहां डेटा को क्लासनेम या विशेषताओं में विस्तारित जानकारी को छिपाने के लिए अन्य दृष्टिकोण में फिट करना मुश्किल है); या

  • जहाँ एक स्क्रिप्टेड एन्हांसमेंट को जितनी जल्दी हो सके बंद करना आवश्यक है (बजाय विंडो-लोड / दस्तावेज़-तैयार होने की प्रतीक्षा के)। इसका एक उदाहरण ऑटोफोकस होगा, जो बहुत देर से निकाल दिए जाने पर जलन कर सकता है।

आप उन <style>तत्वों के बारे में सोच रहे होंगे, जिनकी अनुमति नहीं है <body>(हालाँकि अधिकांश ब्राउज़र इसे फिर भी अनुमति देते हैं)।


12
ऑटोफोकस के लिए +1; कभी-कभी मैं एक धीमे कनेक्शन पर होता हूं और पहले फ़ील्ड में वापस डालते समय पहले से कहीं और (सबसे खराब स्थिति में: पासवर्ड टाइप करना) मज़ेदार नहीं होता।
मार्सेल कोर्पेल

1
हालाँकि, JS एम्बेड करना तब उपयोगी हो सकता है जब केवल एक पृष्ठ हो और सर्वर लुकअप को कम करना हो। एम्बेडेड सीएसएस के लिए एक ही कहानी। लेकिन आम तौर पर एक ही जावास्क्रिप्ट और सीएसएस आवश्यकताओं के साथ एक टेम्पलेट का उपयोग करते समय पृष्ठ लोड समय (एक वैध कैश हेडर का उपयोग करके) को कम करने के लिए अलग-अलग फ़ाइलों में जावास्क्रिप्ट कोड और सीएसएस को अलग करना बेहतर होता है।
कोडबीट

17

दरअसल, यह काफी सामान्य है। उदाहरण के लिए Google का एनालिटिक्स ट्रैकिंग कोड इस सिंटैक्स का उपयोग करता है:

<script type="text/javascript">
  var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
  document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>

यदि यह Google के लिए पर्याप्त है ...


37
-1 - सिर्फ इसलिए कि Google कर रहा है इसका मतलब यह नहीं है कि यह अच्छा अभ्यास है। आम! = अच्छा।
जेसन

3
Google Analytics को वैसे भी अत्यधिक जटिल माना जाता है और ट्रैकिंग के लिए जावास्क्रिप्ट का उनका उपयोग वास्तव में अतिरंजना का एक अच्छा उदाहरण है।
एस्को

इसके अलावा, वे सलाह देते हैं कि आप स्क्रिप्ट को पृष्ठ के निचले भाग पर रखें, बीच में नहीं, जो कि स्क्रिप्ट को वहां रखा जाना चाहिए यदि आपको उन्हें रखना है। हेडर में नहीं जहां लोग आमतौर पर उन्हें डालते हैं
जेसन

2
अलग-अलग विषय: मैं हमेशा Google के अनावश्यक और विचित्र उपयोग से परेशान हूं unescape, जिसे देखते हुए escape/ unescapeइविल (और यह \x3Cकरने का एक बहुत सरल तरीका होगा)।
बोबिन्स

3
@Keltex: कोड अमान्य नहीं है, हालांकि यह दावा करना कि यह अच्छा अभ्यास है, क्योंकि कुछ लोग इसका उपयोग करते हैं, यह एक वैध तर्क नहीं है।
मत्ती वीरकुंकेन

4

यह मान्य है और, आपके सर्वर-साइड फ्रेमवर्क और कोड की प्रकृति के आधार पर, कभी-कभी बचने के लिए बहुत मुश्किल होता है।


4

जैसा कि कई लोगों ने उल्लेख किया है, यह वैध है, यह काम करता है, और इसका व्यापक रूप से उपयोग किया जाता है।

जहाँ तक शब्दार्थ की सिफारिश की जाती है (या कम से कम उपयोग करने के लिए उपयोग की जाने वाली) की सर्वोत्तम प्रथाएँ हेडर के अंदर स्क्रिप्ट टैग लगा रही हैं।

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

कोड को समझने और बनाए रखने में आसानी के लिए, "विनीत जावास्क्रिप्ट" की सिफारिश की जाती है, जहां कोड एक बाहरी फ़ाइल में होता है और ईवेंट को डोम (Google विनीत जावास्क्रिप्ट) से जोड़ता है।

एक मामला जहां यह जावास्क्रिप्ट के लिए उपयोगी है, चर को केवल सर्वर साइड में मौजूद मानों के साथ प्रारंभ करना है, जो बाद में बाहरी जावास्क्रिप्ट कोड द्वारा उपयोग किया जाएगा।


3

मैं बाहरी लिपियों के संदर्भ को सिर में रखना पसंद करता हूं, और स्क्रिप्ट जो चीजों को शुरू करती हैं और विगेट्स को शुरू करती हैं और शरीर में नहीं आती हैं।

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

<div id="foo">
  <script type="text/javascript">
    document.getElementById("foo")... // do something to it
  </script>
</div>

IE आपके पेज को पसंद नहीं करने वाला है। IE के पुराने संस्करणों ने इसके लिए बहुत ही गुप्त त्रुटि संदेश दिया या पूरे पृष्ठ को खाली कर दिया, लेकिन IE8 एक वर्णनात्मक त्रुटि संदेश देता है।

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


3

यह मान्य है!

आप उपयोग कर सकते हैं:

<script type="text/javascript">
    //<![CDATA[

    // Some JavaScript code that perfectly validates in the W3C validator

    //]]>
</script>

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


2
यह सामान्य रूप से एक बुरा अभ्यास है।
जेसन

ठीक है आप सिर्फ पोस्ट पढ़ते हैं, यह जानना अच्छा है। मैं इसे वैसे भी कभी नहीं करता, लेकिन कभी नहीं कि यह आपके ब्राउज़र को लटका सकता है ... ... कैसे आता है?
Meo

1
कोई भी जावास्क्रिप्ट आपके ब्राउज़र को लटका सकता है (कभी-कभी मुझे फ़ायरफ़ॉक्स में 'एबोर्ट स्क्रिप्ट' और 'स्क्रिप्ट जारी रखें' विकल्प के साथ उन अलर्ट बॉक्स मिलते हैं)।
मार्सेल कोर्पेल

यह सच है, कोई भी जेएस आपके ब्राउज़र को लटका सकता है। हालाँकि, यदि आप इसे लटकाने जा रहे हैं (कभी भी अनुशंसित नहीं है), तो बेहतर होगा कि पृष्ठ पूरी तरह से सामग्री के साथ प्रस्तुत हो और उपयोगकर्ता पृष्ठ के साथ पढ़ना / बातचीत करना शुरू कर सके। जेएस आपके ब्राउज़र को क्यों लटकाता है इसका कारण यह है कि यह तुल्यकालिक रूप से चलता है, जिसका अर्थ है कि ब्राउज़र को तब तक इंतजार करना चाहिए जब तक कि जेएस पूरी तरह से निष्पादित होने से पहले पूरी तरह से निष्पादित न हो जाए, क्योंकि यह नहीं जानता कि जेएस क्या करने जा रहा है। हालांकि यह प्रतीक्षा कर रहा है, यह प्रतिपादन नहीं कर रहा है, जिससे यह दिखता है कि यह लटका हुआ है।
जेसन

उस CDATA चीज़ का उपयोग न करें - यह एक बकवास है। केवल XML- सत्यापन करने वाले पार्सर्स CDATA अनुभागों को समझते हैं, इसलिए यदि आपके पृष्ठों को HTML के रूप में परोसा जाता है, तो यह कोई कार्यात्मक अंतर नहीं करता है। हालाँकि यदि आपके पृष्ठ XML के रूप में परोसे जाते हैं, तो यह शुरुआती टैग से पहले "//" को प्रस्तुत करेगा।
भाई

2

मैंने ऐसा पहले नहीं देखा था। यह उन कुछ ब्राउज़रों में काम करने लगता है जिन्हें मैंने परीक्षण किया है। लेकिन जहाँ तक मुझे पता है, इस तरह से स्क्रिप्ट टैग लगाना मान्य नहीं है।

यह मान्य है, लेकिन एक अच्छा (या अनुशंसित) अभ्यास नहीं है।

क्या मै गलत हु? यह कितना बुरा है कि हम स्क्रिप्ट टैग इस तरह से div टैग के भीतर डाल रहे हैं? क्या कोई ब्राउज़र संगतता समस्याएं हैं जिनके बारे में मुझे पता होना चाहिए?

<script>किसी भी अन्य तत्वों के तहत रखने में कोई समस्या नहीं है (लेकिन यह अंदर होना चाहिए <head>या <body>)। ब्राउज़र संगतता के मामले में भी कोई समस्या नहीं है, हालांकि, वेब पेजों पर जेएस लिपियों को एम्बेड करना गंभीर नुकसान (कैसे / क्यों वे खराब हैं) प्रस्तुत करता है :

  1. पेज वेट जोड़ता है
  2. खनन के लिए कठिनाई (या शायद असंभव)
  3. अन्य पृष्ठों के लिए माइग्रेट या उपयोग नहीं किया जा सकता है
  4. कैश नहीं किया जा सकता (पेज लोड होने पर हर बार डाउनलोड करने की आवश्यकता होती है)
  5. चिंताओं की जुदाई नहीं (बनाए रखने के लिए कठिन)

2

हालाँकि, यह भी अच्छा है कि आपको पता है कि HTML के एक हिस्से के लिए आवश्यक जावास्क्रिप्ट कोड इसके लिए होने वाला है। फ़ाइल के शीर्ष पर कुछ सम्मिलित करने और बनाने के बजाय।

इसलिए, इसके बजाय "यदि आप इस HTML का उपयोग करने जा रहे हैं, तो सुनिश्चित करें कि आप xyz.js आयात करते हैं" आप बस HTML को शामिल कर सकते हैं और इसके साथ किया जा सकता है।

तो, यह आवश्यक रूप से भयानक बुराई नहीं है। शायद शानदार नहीं, लेकिन पूरी तरह से भयानक भी नहीं। यह इरादे पर निर्भर करता है।


2

सर्वोत्तम अभ्यास के लिए याहू यूआई देखें: http://developer.yahoo.com/performance/rules.html (पृष्ठ के नीचे जावास्क्रिप्ट)


बड़ा +1! इतने सारे उत्तर, लेकिन उनमें से कोई भी उल्लेख नहीं करता है कि HEAD में स्क्रिप्ट अन्य तत्वों को अवरुद्ध कर सकती हैं (जैसे चित्र! जो कि एक धीमे कनेक्शन पर लेआउट को गड़बड़ कर सकते हैं)
David J

1

यह निश्चित रूप से कानूनी है; मैंने इसे उदाहरण के लिए एक्सफ़ोर्स पर यहां कुछ पृष्ठों पर देखा है ।

अब यह एक ट्यूटोरियल साइट है जो HTML और जावास्क्रिप्ट की मूल बातें दिखाती है, इस संदर्भ में यह पूरी तरह से समझने योग्य है। हालाँकि, मैं इसे एक साधारण कथन या दो से अधिक के लिए उत्पादन कोड में नहीं देखना चाहूंगा। यह देखे बिना कि आपने क्या बदला है, // Some JavaScript code hereमैं टिप्पणी नहीं करना चाहता।

हालांकि इसके साथ कोई ब्राउज़र समस्या नहीं होनी चाहिए।


1

इसमें <script> जोड़ना मान्य है body, लेकिन Internet Explorer वास्तव में इसे पसंद नहीं करता है। तो सुरक्षित पक्ष पर होने के लिए, सुनिश्चित करें कि आपके पास अपनी स्क्रिप्ट <head> टैग के अंदर है।

यह वास्तव में उस परियोजना में कहर पैदा कर रहा था (विशेष रूप से इंटरनेट एक्सप्लोरर के लिए) जिस परियोजना पर हम काम कर रहे हैं।


1

मुझे लगता है कि आपकी टीम या तो ऐसा कर रही है क्योंकि वे एक स्क्रिप्ट को गतिशील रूप से सम्मिलित करना चाहते हैं, या कि वे एक स्क्रिप्ट लिख रहे हैं जो पृष्ठ लोड पर आग लग जाएगी।

मैं यह नहीं कहूंगा कि ऐसा करने में कुछ भी गलत नहीं है जब ABSOLUTELY NECESSARY, (जब तक यह CDATA ब्लॉक में है), लेकिन उसके बाहर, मैं आपकी टीम को सलाह दूंगा कि वे किसी स्क्रिप्ट लाइब्रेरी जैसे कि प्रोटोटाइप या jQuery का उपयोग करें, और रखें स्क्रिप्ट बाहरी पृष्ठ पर। यह आम तौर पर क्लीनर है, और लाइब्रेरी कभी-कभी कोड के लिए थोड़ी सी सफाई के लिए मजबूर करेंगे, जो मैं शर्त लगा सकता हूं कि वर्तमान में नहीं हो रहा है।

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


1

यह कई में से एक है, कई बेहतरीन अभ्यास जो प्रदर्शन में सुधार के बारे में हैं क्योंकि यह प्रोग्रामिंग के लिए आपके दृष्टिकोण को बेहतर बनाने के बारे में है।

अंततः वेब डेवलपमेंट में, उत्पाद को प्राप्त करना सबसे अधिक मायने रखता है!


1

यह पूरी तरह से वैध है, हालांकि यह स्थिरता को नुकसान पहुंचा सकता है। यह भी देखें कि मुझे HTML मार्कअप में <script> टैग कहां रखना चाहिए? और फ़ायरफ़ॉक्स में इस jQuery फ़ंक्शन के लिए कॉल विफल क्यों है?


0

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


0

यदि आपके पास एक संपादक है जो HTML और जावास्क्रिप्ट दोनों सिंटैक्स को एक साथ संभाल सकता है। और अगर आप पहले HTML और फिर जावास्क्रिप्ट cpde ... की कुछ पंक्तियों को पढ़ना पसंद करते हैं ... निश्चित रूप से। इसका लाभ उठाएं।


विजुअल स्टूडियो और रेज़र व्यू जैसी आवाजें जो दोनों को संभाल सकती हैं। यह कुछ मामलों में काफी सुविधाजनक हो सकता है (सभी कोड आपको एक स्थान पर संपादित करने की आवश्यकता होती है)। बेशक बहुत अधिक जावास्क्रिप्ट को देखने में कोड को पढ़ना और समझना मुश्किल हो जाता है और आउटपुट html के फूलने की समस्या भी होती है।
जाहू

0

कुछ बातें:

  1. यह पूरी तरह से मान्य कोड-वार है।
  2. यह पूरी तरह से अप्राप्त है।

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

उच्च प्रदर्शन जावास्क्रिप्ट खरीदें और पढ़ें । यह आपके जावास्क्रिप्ट कोड लिखने के तरीके को बदल देगा।


3
मेरे डाउनवोट्स नहीं, लेकिन जब मुझे लगता है कि याहू, मुझे लगता है YAHOO.util.Event.addListener, कुशल / संक्षिप्त जावास्क्रिप्ट नहीं। मैं एक पुस्तक नहीं पढ़ूंगा और इसे सुसमाचार के रूप में मानूंगा, कभी-कभी आपके पास पृष्ठ में ही जावास्क्रिप्ट होनी चाहिए , उदाहरण के लिए एक चर का गतिशील रूप से प्रतिपादन, कुछ ऐसा जो आप बाहरी रूप से नहीं कर सकते .js
निक Craver

2
क्या आपने यह किताब पढ़ी है? यदि आपके पास था, तो आपको पता होगा कि यह अनुकूलन तकनीक सिखाता है। जैसी चीजें YAHOO.xx.xx.xxस्थानीय रूप से कैश की जाती हैं। इस अवसर पर, हाँ, पृष्ठ पर एक चर को प्रस्तुत करना ठीक है, लेकिन यह आमतौर पर बाहरी रूप से किया जा सकता है यदि आप सर्वर से एक छिपे हुए इनपुट मूल्य को निर्धारित करते हैं। लेकिन मैं यह है कहा unrecommended नहीं गलत । इसके अलावा, निकोलस ज़कास, लेखक, उसकी बकवास जानता है, चाहे उसका नियोक्ता कौन हो।
जेसन

2
"रात्रिभोज लोड हो रहा है" और "पृष्ठ के अंत में लोड करना" अलग-अलग चीजें हैं, और यह अत्यधिक असंभव है कि उन दोनों का उपयोग करने से कोई प्रदर्शन लाभ होता है। "क्या आपने यह किताब पढ़ी है?" और "मैं सही हूं" भी रचनात्मक बातचीत शुरू करने का सबसे अच्छा तरीका नहीं है। साथ ही मूल प्रश्न का उत्तर दिया जा सकता है "क्योंकि यह अंततः IE पर चोक करता है", क्योंकि कुछ ऑपरेशन केवल समर्थित हैं यदि स्क्रिप्ट शरीर का एक सीधा बच्चा है।
नाचो कोलोमा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.