سؤال

ما هو السبب المتصفحات لا تتعرف بشكل صحيح:

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

فقط هذا هو الاعتراف:

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

هل هذا كسر مفهوم XHTML الدعم ؟

ملاحظة:هذا البيان هو الصحيح على الأقل كل IE (6-8 بيتا 2).

هل كانت مفيدة؟

المحلول

XHTML 1 مواصفات يقول:

С.3.العنصر الحد وإفراغ محتوى العنصر

نظرا فارغة مثيل من عنصر المحتوى الذي النموذج ليس EMPTY (على سبيل المثال ، عنوان فارغ أو الفقرة) لا تستخدم تصغير شكل (مثلا ، استخدام <p> </p> و لا <p />).

DTD XHTML يحدد السيناريو العناصر:

<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>

نصائح أخرى

إضافة إلى ما براد squadette قال الذاتي إغلاق XML الجملة <script /> فعلا هو الصحيح XML, ولكن في الممارسة العملية ، خادم الويب الخاص بك يحتاج أيضا إلى إرسال المستندات الخاصة بك بشكل صحيح XML مع XML نوعه مثل application/xhtml+xml في HTTP رأس نوع محتوى (و لا كما text/html).

ومع ذلك ، إرسال XML نوعه سوف يسبب الصفحات الخاصة بك لا يتم تحليل IE7 الذي يحب فقط text/html.

من w3:

في ملخص, 'التطبيق/xhtml+xml' ينبغي استخدام XHTML الأسرة الوثائق واستخدام 'text/html' ينبغي أن تكون محدودة إلى HTML متوافق مع XHTML 1.0 الوثائق.'التطبيق/xml' و 'text/xml' يمكن أن تستخدم أيضا, ولكن كلما كان ذلك مناسبا ، 'التطبيق/xhtml+xml' ينبغي أن تستخدم بدلا من تلك XML عام الإعلام أنواع.

أنا في حيرة أكثر من هذا قبل بضعة أشهر فقط قابلة للتطبيق (متوافق مع FF3+ و IE7) وكان الحل استخدام القديم <script></script> بناء الجملة مع text/html (HTML الجملة + HTML نوع mime).

إذا كان الخادم الخاص بك يرسل text/html اكتب في رؤوس HTTP, حتى مع غير ذلك شكلت بشكل صحيح XHTML الوثائق ، FF3+ سيتم استخدام HTML طريقة التقديم مما يعني أن <script /> لا تعمل (هذا هو التغيير, فيرفكس كان في السابق أقل صرامة).

يحدث هذا بغض النظر عن أي تافه مع http-equiv العناصر الوصفية, XML حاسوب أو doctype داخل المستند الخاص بك -- فايرفوكس فروع مرة واحدة يحصل على text/html رأس ، أن يحدد ما إذا كان HTML أو XML محلل يبدو داخل المستند HTML محلل لا يفهم <script />.

في حالة أي شخص غريب ، في نهاية المطاف السبب هو أن HTML أصلا لهجة من SGML, وهو XML غريب الأخ الأكبر.في SGML-الأراضي العناصر يمكن أن تكون محددة في DTD إما ذاتية الإغلاق (مثلا ، BR HR, المدخلات) ، ضمنا closeable (مثلا ، P لى TD) ، أو صراحة closeable (مثلا ، الجدول, DIV, النصي).XML بالطبع لا يوجد لديه مفهوم هذا.

العلامة-شوربة موزعي المستخدمة من قبل المتصفحات الحديثة تطورت من هذا الإرث ، على الرغم من أن تحليل نموذج ليست نقية SGML بعد الآن.وبطبيعة الحال الخاص بك وضعت بعناية XHTML يتم معاملة سيئة مكتوبة SGML مستوحاة من الوسم-شوربة إلا إذا كنت إرساله مع XML نوع mime.وهذا هو أيضا السبب...

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

...يحصل على تفسير من قبل المتصفح مثل:

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

...الذي هو صفة جميلة غامضة الخلل الذي يمكن أن يلقي عليك في تناسبها كما كنت في محاولة قانون ضد دوم.

آخرون أجاب "كيف" و نقلت المواصفات.هنا هو قصة حقيقية "لماذا لا <script/>"بعد عدة ساعات من البحث في علة التقارير والقوائم البريدية.


HTML 4

HTML 4 على أساس SGML.

SGML بعض shorttags, مثل <BR//, <B>text</>, <B/text/, أو <OL<LI>item</LI</OL>.XML يأخذ النموذج الأول ، يعيد وتنتهي ">" (SGML هي مرنة) ، بحيث يصبح <BR/>.

ومع ذلك, HTML لم redfine ، لذلك <SCRIPT/> يجب أن يعني <SCRIPT>>.
(نعم '>' يجب أن تكون جزءا من محتوى العلامة لا يزال لا مغلقة.)

ومن الواضح أن هذا غير متوافق مع XHTML و سوف كسر العديد من المواقع (قبل الوقت المتصفحات كانت ناضجة بما فيه الكفاية إلى الرعاية عن هذا) ، وذلك لا أحد ينفذ shorttags و مواصفات تنصح لهم.

على نحو فعال, جميع 'العامل' الذاتي انتهت الكلمات هي الكلمات الدليلية مع اختياري نهاية الوسم على الناحية الفنية غير conformant موزعي و هي في الحقيقة غير صالحة.كان W3C والتي جاء مع هذا الإختراق للمساعدة في الانتقال إلى XHTML بجعله HTML متوافق.

و <script>'s نهاية الوسم هو ليس اختياري.

الذاتي "إنهاء" الوسم هو الإختراق في HTML 4 و لا معنى له.


HTML 5

وقد HTML5 خمسة أنواع من العلامات فقط 'الفراغ' و 'الخارجية' العلامات يسمح أن تكون ذاتية الإغلاق.

لأن <script> ليس باطلا (ذلك قد يكون المحتوى) وليس الخارجية (مثل MathML أو SVG) ، <script> لا يمكن أن تكون ذاتية مغلقة ، بغض النظر عن كيفية استخدامه.

ولكن لماذا ؟ لا يمكن أن نعتبره الخارجية ، وجعل حالة خاصة أو ما شابه ؟

HTML 5 يهدف إلى أن يكون متوافقة مع تطبيقات HTML 4 و XHTML 1.ليس على أساس SGML أو XML;بناء الجملة هي المعنية أساسا مع توثيق وتوحيد التطبيقات.(هذا هو السبب <br/> <hr/> الخ.هي صالحة HTML 5 على الرغم من كونها غير صالحة HTML4.)

ذاتية الإغلاق <script> هي واحدة من العلامات حيث التطبيقات المستخدمة تختلف.ذلك في كروم, سفاري, و أوبرا;على حد علمي أن ذلك لم يفلح في إنترنت إكسبلورر أو فايرفوكس.

وقد نوقش هذا عندما HTML 5 صياغة و حصلت على رفض لأنه فواصل المتصفح التوافق.صفحات الويب التي ذاتي بالقرب من العلامة النصي قد لا تعرض بشكل صحيح (على كل) في المتصفحات القديمة.كانت هناك مقترحات أخرى, ولكن لا يستطيعون حل مشكلة التوافق سواء.

بعد مشروع صدر ، بكت تحديث المحلل أن يكون في التوافق.

ذاتية الإغلاق <script> لا يحدث في HTML 5 بسبب التوافق HTML 4 و XHTML 1.


XHTML 1 / XHTML 5

عندما حقا بمثابة XHTML ، <script/> هو حقا مغلقة ، إجابات أخرى وقد ذكر.

إلا أن المواصفات تقول ذلك يجب أن عملت عندما شغل منصب HTML:

XHTML الوثائق ...قد يكون المسمى مع وسائل الإعلام الإنترنت نوع "text/html" [RFC2854] ، كما أنها متوافقة مع معظم HTML المتصفحات.

إذا ماذا حدث ؟

الناس طلب موزيلا إلى اسمحوا فايرفوكس تحليل مطابقة الوثائق XHTML بغض النظر عن محتوى معين رأس (المعروفة باسم المحتوى استنشاق).هذا من شأنه أن يسمح ذاتية الإغلاق النصوص والمحتوى استنشاق كان من الضروري على أي حال لأن ويب hosters لم تكن ناضجة بما فيه الكفاية لخدمة الصحيح رأس ؛ أي كان جيدة في ذلك.

إذا كان أول متصفح الحرب لم تنتهي مع IE 6 ، XHTML قد يكون على قائمة أيضا.لكنها لم تنتهي.و IE 6 لديه مشكلة مع XHTML.في الواقع أي لم تدعم نوع MIME الصحيح في كل, ، مما اضطر الجميع استخدام text/html بالنسبة XHTML لأن أي كبيرة من حصة السوق لعقد كامل من الزمن.

و أيضا محتوى استنشاق يمكن حقا سيئة و يقول الناس يجب أن توقف.

وأخيرا اتضح أن W3C لم أقصد XHTML أن يكون sniffable:الوثيقة سواء, HTML ، XHTML ، Content-Type قواعد.يمكن للمرء أن يقول كانوا يقفون شركة "فقط اتبع المواصفات" ، وتجاهل ما هو عملي.خطأ واصل في وقت لاحق XHTML الإصدارات.

على أي حال, هذا القرار حسم مسألة لفايرفوكس.كان 7 سنوات قبل كروم ولد;لا يوجد الهامة الأخرى المتصفح.وهكذا تقرر.

تحديد doctype وحدها لا تؤدي إلى تحليل XML بسبب المواصفات التالية.

Internet Explorer 8 و في وقت سابق لا تدعم XHTML تحليل.حتى إذا كنت تستخدم XML الإعلان و/أو XHTML doctype, IE القديمة لا تزال تحليل المستند كـ HTML عادي.و في HTML عادي ، ذاتية الإغلاق بناء جملة غير معتمد.زائدة مائل هو فقط تجاهل لديك لاستخدام صريح إغلاق الوسم.

حتى المتصفحات مع دعم XHTML تحليل مثل IE 9 وما بعدها, سوف لا يزال تحليل المستند كـ HTML إلا إذا كنت تعمل على مستند XML نوع المحتوى.ولكن في هذه الحالة IE القديمة سوف يتم عرض الوثيقة على الإطلاق!

الناس فوق بالفعل الكثير جدا من أوضح هذه المسألة ، ولكن الشيء الوحيد الذي قد يجعل الأمور واضحة هي أنه على الرغم من استخدام الناس <br/> و مثل هذا في كل وقت في وثائق HTML ، أي / في مثل هذا الموقف هو الأساس تجاهلها ، وتستخدم فقط عند محاولة جعل كل شيء parseable كما XML و HTML.محاولة <p/>foo</p>, على سبيل المثال ، يمكنك الحصول على العادية الفقرة.

النفس إغلاق العلامة النصي لن يجدي لأن العلامة النصي يمكن أن تحتوي على مضمنة رمز HTML ليست ذكية بما فيه الكفاية لتشغيل أو إيقاف تشغيل هذه الميزة على أساس وجود سمة.

من ناحية أخرى, HTML لديها ممتازة الوسم بما في ذلك الإشارات إلى المصادر الخارجية:على <link> الوسم ، ويمكن ذاتية الإغلاق.إنها استخدمت بالفعل أن تشمل الأنماط, RSS و Atom يغذي الكنسي محددات ، وجميع أنواع الأشياء الجيدة الأخرى.لماذا لا جافا سكريبت ؟

إذا كنت تريد العلامة النصي أن تكون النفس المرفقة لا يمكنك أن تفعل ذلك كما قلت ، ولكن هناك بديل ، على الرغم من أنها ليست ذكية واحدة.يمكنك استخدام الذاتي إغلاق رابط الوسم و رابط جافا سكريبت الخاصة بك من خلال إعطائها نوع من نص/جافا سكريبت rel كما النصي, شيء مثل أدناه:

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

على عكس XML و XHTML, HTML لا علم ذاتية الإغلاق بناء الجملة.المتصفحات التي تفسر XHTML HTML لا أعرف أن / حرف يشير إلى أن العلامة يجب أن تكون ذاتية الإغلاق ؛ بدلا من ذلك أنها تفسير ذلك مثل فارغة السمة محلل لا يزال يعتقد الوسم هو 'فتح'.

كما <script defer> هو تعامل <script defer="defer">, <script /> هو تعامل <script /="/">.

Internet Explorer 8 و السن لا تدعم السليم نوع MIME XHTML ، application/xhtml+xml.إذا كنت تخدم XHTML كما text/html, التي يجب أن لهذه الإصدارات القديمة من إنترنت إكسبلورر على فعل أي شيء ، سيكون تفسيره HTML 4.01.يمكنك فقط استخدام جملة قصيرة مع أي عنصر يسمح إغلاق الوسم أن تكون محذوفة.ترى HTML 4.01 مواصفات.

XML 'النموذج' يتم تفسيرها على أنها سمة اسمه / ، (لأنه لا يوجد علامة التساوي) هو تفسير وجود ضمني قيمة "/".هذا هو الخطأ بدقة في HTML 4.01 - غير معلنة سمات لا يسمح لكن المتصفحات سيتم تجاهله.

IE9 وما بعدها دعم XHTML 5 تقدم مع application/xhtml+xml.

ذلك لأن العلامة النصي ليست باطلة عنصر.

في مستند HTML - الفراغ العناصر لا بحاجة إلى "إغلاق الوسم" على الإطلاق!

في xhtml, كل عام, ولذلك كل حاجة إنهاء على سبيل المثالو "إغلاق الوسم";بما في ذلك br خط بسيط كسر ، <br></br> أو الاختزال <br />.

ومع ذلك, السيناريو عنصر أبدا الفراغ أو حدودي عنصر ، لأن العلامة النصي قبل أي شيء آخر ، هو متصفح التعليمات ، وليس البيانات وصف الإعلان.

أساسا ، الدلالي إنهاء تعليمات مثل "إغلاق الوسم" هو فقط يحتاج لتجهيز تعليمات من دلالات لا يمكن إنهاؤها من قبل خلفا الوسم.على سبيل المثال:

<H1> دلالات لا يمكن إنهاؤها من قبل التالية <P> لأنها لا تحمل ما يكفي من تلقاء نفسها دلالات لتجاوز وبالتالي إنهاء السابقة H1 مجموعة التعليمات.على الرغم من أنها سوف تكون قادرة على كسر تيار في فقرة جديدة خط, انها ليست "قوية بما يكفي" لتجاوز الحاضر حجم الخط ونمط خط الطول تنهمر تيار, أنا.هـ تسرب من H1 (بسبب P لا يجب عليه).

هذا هو كيف ولماذا "/" (إنهاء) التنبيه قد تم اختراعه.

عام لا وصف إنهاء الوسم مثل < />, سوف يكون كافيا لأي واحد تسقط واجه سلسلة, على سبيل المثال: <H1>Title< /> ولكن هذا ليس الحال دائما, لأننا نريد أيضا أن تكون قادرة على "التعشيش" متعددة وسيط علامات من تيار:تنقسم إلى السيول قبل التفاف / تقع على آخر تتالي.ونتيجة عام منهي مثل < /> لن تكون قادرة على تحديد الهدف من خاصية إنهاء.على سبيل المثال: <b>جريئة <i>غامق-مائل < /> مائل </>عادي.مما لا شك فيه أن تفشل في الحصول على نيتنا الحق و على الأرجح تفسير ذلك كما جريئة جريئة-itallic جريئة عادي.

هذا هو كيف فكرة من المجمع أي. ، حاوية ولد.(هذه المفاهيم هي مماثلة بحيث أنه من المستحيل أن نستشف بعض الأحيان نفس العنصر قد يكون على حد سواء. <H1> هو كل من المجمع و الحاويات في نفس الوقت.في حين <B> فقط الدلالي المجمع).نحتاج عادي ، أي دلالات الحاوية.وبالطبع اختراع عنصر DIV جاء من قبل.

DIV العنصر هو في الواقع 2BR-حاوية.بالطبع القادمة من CSS جعل الوضع أكثر غرابة من ذلك لولا وتسبب في ارتباك كبير مع العديد من العواقب غير مباشر!

لأنه مع CSS يمكن بسهولة تجاوز الأم قبل&بعد BR سلوك اخترع حديثا شعبة ، وغالبا ما يشار إليها بوصفها "لا تفعل شيئا حاوية".الذي هو بطبيعة الحال خطأ!DIVs هي عناصر كتلة وسوف أصلا كسر خط تيار سواء قبل أو بعد انتهاء الإشارات.قريبا على شبكة الإنترنت بدأت تعاني من صفحة DIV يتيس.معظمهم لا يزال هناك.

مجيء CSS مع قدرته الكاملة تجاوز تماما تعريف الأم سلوك أي علامة HTML بطريقة ما تمكنت من الخلط بين وطمس كل معنى HTML وجود...

فجأة كل علامات HTML ظهرت كما لو عفا عليها الزمن ، كانوا تشويه ، تجريده من كل معنى الأصل والهوية الغرض.بطريقة ما كنت كسب الانطباع بأنهم لم تعد هناك حاجة.قائلا:حاوية واحدة-المجمع الوسم تكفي لجميع عرض البيانات.فقط إضافة السمات المطلوبة.لماذا لا يكون معنى الكلمات بدلا من ذلك ؛ يخترع أسماء العلامات كما تذهب والسماح CSS عناء مع بقية.

هذا هو كيف xhtml ولد وطبعا كبيرة حادة ، دفعت غاليا جدا من قبل القادمين الجدد و مشوهة رؤية ما هو ما ، و ما هي اللعنة الغرض من كل ذلك.W3C ذهب من شبكة ويب العالمية أن ما حدث من خطأ يا رفاق؟!!

الغرض من HTML إلى تيار بيانات ذات مغزى الإنسان المتلقي.

لتقديم المعلومات.

الجزء الرسمي هناك فقط مساعدة وضوح توصيل المعلومات.xhtml لا تعطي أدنى النظر إلى المعلومات. إلى ذلك ، فإن المعلومات ذات صلة على الإطلاق.

أهم شيء في الموضوع هو معرفة وتكون قادرة على فهم ذلك xhtml ليست مجرد نسخة من بعض مدد HTML, xhtml هي مختلفة تماما الوحش ؛ أسباب ؛ وبالتالي فإنه من الحكمة الاحتفاظ بها منفصلة.

الفرق بين 'صحيح XHTML', 'فو XHTML و HTML وكذلك أهمية خادم أرسلت نوع MIME كان بالفعل هو موضح هنا حسنا.إذا كنت تريد أن تجرب ذلك الآن هنا هو بسيط للتحرير مقتطف مع المعاينة المباشرة بما في ذلك الذات إغلاق البرنامج النصي علامة قادرة على المتصفحات:

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! أدناه النص.

بالنسبة قادر المتصفحات يمكنك نسخ المحتوى من ناحية النص وحفظه كملف مع .xhtml (أو .xht) ملحق (شكرا أليك هذا تلميح).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top