javascript - tutorial - w3schools




स्वयं-बंद स्क्रिप्ट टैग क्यों काम नहीं करते हैं? (8)

ब्राउजर सही तरीके से पहचानने का कारण क्या है:

<script src="foobar.js" /> <!-- self-closing script tag -->

केवल यह पहचाना जाता है:

<script src="foobar.js"></script>

क्या यह एक्सएचटीएमएल समर्थन की अवधारणा को तोड़ता है?

नोट: यह कथन कम से कम सभी आईई (6-8 बीटा 2) के लिए सही है।


ऐसा इसलिए है क्योंकि SCRIPT TAG एक VOID तत्व नहीं है।

एक HTML दस्तावेज़ में - VOID ELEMENTS को "बंद टैग" की आवश्यकता नहीं है!

एक्सएचटीएमएल में , सबकुछ जेनेरिक है, इसलिए उन्हें सभी को समापन की आवश्यकता है जैसे "समापन टैग"; बीआर सहित, एक साधारण लाइन-ब्रेक, जैसे <br></br> या इसके शॉर्टेंड <br />

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

मुख्य रूप से, एक अर्थपूर्ण समाप्ति निर्देश, उदाहरण के लिए, "समापन टैग" केवल उन निर्देशों को संसाधित करने के लिए आवश्यक होता है, जो कि अर्थात् टैग को समाप्त टैग द्वारा समाप्त नहीं किया जा सकता है। उदाहरण के लिए:

<H1> अर्थशास्त्र को निम्नलिखित <P> द्वारा समाप्त नहीं किया जा सकता है क्योंकि इसमें ओवरराइड करने के लिए पर्याप्त मात्रा में अपने अर्थशास्त्र नहीं होते हैं और इसलिए पिछले एच 1 निर्देश सेट को समाप्त कर देते हैं। यद्यपि यह धारा को एक नई पैराग्राफ लाइन में तोड़ने में सक्षम होगा, लेकिन वर्तमान फ़ॉन्ट आकार और स्टाइल लाइन-ऊंचाई को ओवरराइड करने के लिए यह "पर्याप्त मजबूत" नहीं है, यानी स्ट्रीम को डालना , यानी एच 1 से लीक करना (क्योंकि पी में यह नहीं है )।

यह कैसे और क्यों "/" (समाप्ति) संकेत का आविष्कार किया गया है।

एक जेनेरिक नो-स्टेटमेंट टर्मिनेशन टैग जैसे < /> , किसी भी एकल गिरावट के लिए सामना करना पड़ा होगा, उदाहरण के लिए: <H1>Title< /> लेकिन यह हमेशा मामला नहीं है, क्योंकि हम भी "घोंसले" करने में सक्षम होना चाहते हैं ", स्ट्रीम की कई मध्यवर्ती टैगिंग: रैपिंग / किसी अन्य कैस्केड पर गिरने से पहले टोरेंटों में विभाजित करें। नतीजतन एक सामान्य टर्मिनेटर जैसे < /> किसी संपत्ति को समाप्त करने के लक्ष्य को निर्धारित करने में सक्षम नहीं होगा। उदाहरण के लिए: <b> बोल्ड <i> बोल्ड-इटैलिक < /> इटैलिक </> सामान्य। निस्संदेह हमारे इरादे को सही करने में असफल रहेगा और शायद इसे बोल्ड बोल्ड-इटैलिक बोल्ड सामान्य के रूप में समझा जाएगा।

इस प्रकार एक रैपर यानी कंटेनर की धारणा पैदा हुई थी। (ये धारणाएं इतनी समान हैं कि यह समझना असंभव है और कभी-कभी एक ही तत्व दोनों में हो सकता है। <H1> एक ही समय में दोनों रैपर और कंटेनर है। जबकि <B> केवल एक अर्थपूर्ण आवरण)। हमें एक सादा, कोई अर्थशास्त्र कंटेनर की आवश्यकता होगी। और निश्चित रूप से एक डीआईवी तत्व का आविष्कार आया था।

डीआईवी तत्व वास्तव में एक 2BR-कंटेनर है। निश्चित रूप से सीएसएस के आने से पूरी स्थिति कमजोर हो गई है, अन्यथा यह बहुत अच्छा परिणाम हुआ है और अप्रत्यक्ष रूप से कई महान परिणामों के साथ एक बड़ा भ्रम पैदा हुआ है!

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

किसी भी एचटीएमएल टैग के मूल व्यवहार को पूरी तरह से ओवरराइड करने और पूरी तरह से परिभाषित करने की अपनी क्षमता के साथ सीएसएस का आ रहा है, किसी भी तरह से एचटीएमएल अस्तित्व के पूरे अर्थ को भ्रमित और धुंधला करने में कामयाब रहा ...

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

इस प्रकार एक्सएचटीएमएल का जन्म हुआ और निश्चित रूप से महान ब्लंट, नए कॉमर्स द्वारा इतनी प्यारी और एक विकृत दृष्टि का भुगतान किया, और इसका क्या उद्देश्य है। डब्ल्यू 3 सी वर्ल्ड वाइड वेब से क्या हुआ गलत, कामरेड? !!

एचटीएमएल का उद्देश्य मानव प्राप्तकर्ता को सार्थक डेटा स्ट्रीम करना है।

जानकारी देने के लिए।

औपचारिक हिस्सा केवल सूचना वितरण की स्पष्टता में सहायता करने के लिए है। xhtml जानकारी को थोड़ा सा विचार नहीं देता है। - इसके लिए, जानकारी बिल्कुल अप्रासंगिक है।

इस मामले में सबसे महत्वपूर्ण बात यह जानना और समझने में सक्षम होना है कि xhtml कुछ विस्तारित HTML का संस्करण नहीं है , xhtml एक पूरी तरह से अलग जानवर है; आधार ऊपर; और इसलिए उन्हें अलग रखना बुद्धिमानी है।


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

div { display: flex; }
div + div {flex-direction: column; }
<div>Mime type: <label><input type="radio" onchange="t.onkeyup()" id="x" checked  name="mime"> application/xhtml+xml</label>
<label><input type="radio" onchange="t.onkeyup()" name="mime"> text/html</label></div>
<div><textarea id="t" rows="4" 
onkeyup="i.src='data:'+(x.checked?'application/xhtml+xml':'text/html')+','+encodeURIComponent(t.value)"
><?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
[<!ENTITY x "true XHTML">]>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
  <p>
    <span id="greet" swapto="Hello">Hell, NO :(</span> &x;.
    <script src="data:text/javascript,(g=document.getElementById('greet')).innerText=g.getAttribute('swapto')" />
    Nice to meet you!
    <!-- 
      Previous text node and all further content falls into SCRIPT element content in text/html mode, so is not rendered. Because no end script tag is found, no script runs in text/html
    -->
  </p>
</body>
</html></textarea>

<iframe id="i" height="80"></iframe>

<script>t.onkeyup()</script>
</div>

आपको Hello, true XHTML. Nice to meet you! देखना चाहिए Hello, true XHTML. Nice to meet you! Hello, true XHTML. Nice to meet you! Textarea के नीचे।

अक्षम करने योग्य ब्राउज़रों के लिए आप textarea की सामग्री कॉपी कर सकते हैं और इसे .xht (या .xht ) एक्सटेंशन के साथ फ़ाइल के रूप में सहेज सकते हैं ( इस संकेत के लिए धन्यवाद Alek )।


इंटरनेट एक्सप्लोरर 8 और पुराने एक्सएचटीएमएल, application/xhtml+xml लिए उचित एमआईएमई प्रकार का समर्थन नहीं करते हैं। यदि आप text/html रूप में एक्सएचटीएमएल की सेवा कर रहे हैं, जो आपको इंटरनेट एक्सप्लोरर के इन पुराने संस्करणों के लिए कुछ भी करने के लिए है, तो इसे HTML 4.01 के रूप में व्याख्या किया जाएगा। आप केवल उस तत्व के साथ शॉर्ट सिंटैक्स का उपयोग कर सकते हैं जो समापन टैग को छोड़ा जा सकता है। एचटीएमएल 4.01 विशिष्टता देखें।

एक्सएमएल 'शॉर्ट फॉर्म' को एक विशेषता के रूप में व्याख्या किया गया है, जो (क्योंकि कोई बराबर चिह्न नहीं है) को "/" का अंतर्निहित मान माना जाता है। यह HTML 4.01 में सख्ती से गलत है - अविकसित विशेषताओं की अनुमति नहीं है - लेकिन ब्राउज़र इसे अनदेखा कर देंगे।

आईई 9 और बाद में एक्सएचटीएमएल 5 का समर्थन application/xhtml+xml


उपर्युक्त लोगों ने पहले ही इस मुद्दे को काफी समझाया है, लेकिन एक चीज जो चीजों को स्पष्ट कर सकती है वह यह है कि, हालांकि लोग HTML दस्तावेज़ों में '&lt;br/>' उपयोग करते हैं, ऐसी स्थिति में कोई भी '/' है मूल रूप से अनदेखा किया जाता है, और केवल XML और HTML दोनों के रूप में कुछ दृष्टांत बनाने की कोशिश करते समय उपयोग किया जाता है। '&lt;p/>foo&lt;/p>' , उदाहरण के लिए, और आपको नियमित पैराग्राफ मिलता है।


एक्सएमएल और एक्सएचटीएमएल के विपरीत, एचटीएमएल को स्वयं बंद सिंटैक्स का कोई ज्ञान नहीं है। ब्राउज़र जो एक्सएचटीएमएल को एचटीएमएल के रूप में समझते हैं, यह नहीं जानते कि / चरित्र इंगित करता है कि टैग स्वयं बंद होना चाहिए; इसके बजाय वे इसे एक खाली विशेषता की तरह समझते हैं और पार्सर अभी भी सोचता है कि टैग 'खुला' है।

जैसे <script defer> को <script defer="defer"> रूप में माना जाता है, <script /> को <script /="/"> रूप में माना जाता है।


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

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

<p><div>hello</div></p>

... ब्राउज़र द्वारा व्याख्या की गई है:

<p></p><div>hello</div><p></p>

... जो एक सुंदर अस्पष्ट बग के लिए नुस्खा है जो आपको डीओएम के खिलाफ कोड करने की कोशिश करते समय फिट बैठता है।


ब्रैड और स्क्वाडेट ने जो कहा है, उसे जोड़ने के लिए, स्वयं बंद एक्सएमएल सिंटैक्स <script /> वास्तव में सही एक्सएमएल है, लेकिन इसके लिए अभ्यास में काम करने के लिए, आपके वेब सर्वर को आपके दस्तावेज़ों को एक्सएमएल माइमटाइप के साथ एक्सएमएल के ठीक तरह से गठित करने की आवश्यकता है HTTP सामग्री-प्रकार शीर्षलेख में application/xhtml+xml तरह (और text/html रूप में नहीं )।

हालांकि, एक एक्सएमएल माइमटाइप भेजने से आपके पृष्ठों को आईई 7 द्वारा पार्स नहीं किया जाएगा, जो केवल text/html पसंद करता है।

w3 :

संक्षेप में, 'एप्लिकेशन / एक्सएचटीएमएल + एक्सएमएल' एक्सएचटीएमएल परिवार दस्तावेजों के लिए इस्तेमाल किया जाना चाहिए, और 'टेक्स्ट / एचटीएमएल' का उपयोग HTML- संगत XHTML 1.0 दस्तावेज़ों तक सीमित होना चाहिए। 'एप्लिकेशन / एक्सएमएल' और 'टेक्स्ट / एक्सएमएल' का भी उपयोग किया जा सकता है, लेकिन जब भी उचित हो, 'जेनरेट एक्सएमएल मीडिया प्रकारों' के बजाय 'एप्लिकेशन / एक्सएचटीएमएल + एक्सएमएल' का इस्तेमाल किया जाना चाहिए।

मैंने कुछ महीने पहले इस पर चर्चा की, और केवल काम करने योग्य (एफएफ 3 + और आईई 7 के साथ संगत) समाधान पुराने <script></script> वाक्यविन्यास को text/html (एचटीएमएल सिंटैक्स + एचटीएमएल माइमटाइप) के साथ उपयोग करना था।

यदि आपका सर्वर text/html प्रकार को अपने HTTP शीर्षकों में भेजता है, अन्यथा ठीक से एक्सएचटीएमएल दस्तावेजों के साथ भी, एफएफ 3 + अपने एचटीएमएल प्रतिपादन मोड का उपयोग करेगा जिसका अर्थ है कि <script /> काम नहीं करेगा (यह एक बदलाव है, फ़ायरफ़ॉक्स पहले कम सख्त था )।

यह आपके दस्तावेज़ के अंदर http-equiv मेटा टैग, एक्सएमएल प्रोलॉग या डॉक्ट text/html साथ किसी भी झुकाव के बावजूद होगा - फ़ायरफ़ॉक्स शाखाओं को एक बार यह text/html हेडर प्राप्त करने के बाद, यह निर्धारित करता है कि HTML या XML पार्सर दस्तावेज़ के अंदर दिखता है या नहीं, और एचटीएमएल पार्सर <script /> समझ में नहीं आता है।


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

दूसरी तरफ, एचटीएमएल के पास बाहरी संसाधनों के संदर्भों के लिए एक उत्कृष्ट टैग है: <link> टैग, और यह स्वयं बंद हो सकता है। यह पहले से ही स्टाइलशीट, आरएसएस और एटम फ़ीड, कैननिकल यूआरआई, और अन्य उपहारों के सभी प्रकार शामिल करने के लिए उपयोग किया जाता है। जावास्क्रिप्ट क्यों नहीं?

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

<link type="text/javascript" rel ="script" href="/path/tp/javascript" />




xhtml