ทำไมองค์ประกอบสคริปต์ที่ปิดตัวเองไม่ทำงาน


1346

สาเหตุที่เบราว์เซอร์ไม่รู้จักอย่างถูกต้อง:

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

เป็นที่รู้จักเท่านั้น:

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

สิ่งนี้ทำลายแนวคิดของ XHTML ที่สนับสนุนหรือไม่

หมายเหตุ: คำสั่งนี้ถูกต้องอย่างน้อยสำหรับ IE ทั้งหมด (6-8 beta 2)


12
ทำงานใน Chrome และ Opera
corymathews

46
Chrome รุ่นล่าสุดบางรุ่นดูเหมือนว่าจะใช้งานไม่ได้แท็กสคริปต์ที่ปิดตัวเองไม่สามารถใช้งานได้ใน Chrome อีกต่อไป
Adam Ness

13
มันไม่ใช่แค่แท็กสคริปต์ ฉันไม่เชื่อว่าแท็ก div ที่ปิดตัวเองจะทำงานเช่นกัน
DOK

6
ตั้งแต่เดือนกรกฎาคม 2011, Chrome และ Firefox มีปัญหานี้ "มันไม่ใช่บั๊กมันเป็นคุณสมบัติ" - น่ารำคาญจริงๆ
Martin Konicek

4
รุ่นทั่วไปเพิ่มเติมนี้ถูกถามสองวันต่อมา: stackoverflow.com/questions/97522/ …
Ciro Santilli 冠状病毒审查审查六四事件法轮功

คำตอบ:


481

ข้อกำหนด XHTML 1 บอกว่า:

С.3 การย่อขนาดองค์ประกอบและเนื้อหาองค์ประกอบว่างเปล่า

กำหนดอินสแตนซ์ที่ว่างเปล่าขององค์ประกอบที่มีโมเดลเนื้อหาไม่EMPTY(ตัวอย่างเช่นชื่อหรือย่อหน้าที่ว่างเปล่า) อย่าใช้รูปแบบย่อเล็กสุด (เช่นใช้<p> </p>และไม่<p />)

XHTML DTDระบุองค์ประกอบของสคริปต์เป็น:

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

111
ถึงกระนั้น "ไม่" ไม่เหมือนกันกับ "ต้องไม่" นี่คือแนวทาง (สำหรับความเข้ากันได้ตามที่แนะนำโดยชื่อส่วน) ไม่ใช่กฎ
Konrad Rudolph

42
ที่จริงแล้วฉันไม่พบการใช้งานสำหรับข้อ จำกัด นี้ :) ดูเหมือนว่าจะเป็นการประดิษฐ์อย่างสมบูรณ์
ฝูงบิน

22
คำตอบที่ถูกต้องได้รับจาก olavk ภาคผนวก C ของ XHTML 1.0 ไม่ใช่เหตุผลว่าทำไมสิ่งต่าง ๆ เป็นเช่นไร - เป็นเพียงวิธีการทำงานในแบบที่เป็นอยู่
hsivonen

32
มันไม่ได้เป็นส่วนหนึ่งของข้อกำหนด เป็นเพียงภาคผนวกเกี่ยวกับวิธีจัดการกับเบราว์เซอร์ที่ไม่รองรับ XHTML
Kornel

12
ปัญหาที่เกิดขึ้น<script />ไม่ใช่ว่าข้อมูลจำเพาะไม่สามารถทำได้ แต่เบราว์เซอร์จะไม่ตีความว่าเป็น "non-tag-soup" หากประเภทเนื้อหาไม่ใช่ application / xhtml + xml ดู: stackoverflow.com/questions/348736/… @shabunc: เบราว์เซอร์อาจดูเหมือนจะเข้าใจ แต่สิ่งที่เกิดขึ้นจริงคือการใส่เนื้อหาหลังจาก <p /> ในย่อหน้าเนื่องจากการตีความคำพูดของทีมแปลว่าหมายความว่าตั้งแต่ < p> ไม่ว่างเปล่าไม่สามารถปิดตัวเองได้ ใน XHTML 1.1 สามารถปิดตนเองได้
Joe

241

ในการเพิ่มสิ่งที่แบรดและ squadette ได้กล่าวว่าไวยากรณ์ XML ปิดด้วยตัวเอง<script />จริงเป็น XML ที่ถูกต้อง แต่เพื่อให้การทำงานในทางปฏิบัติเว็บเซิร์ฟเวอร์ของคุณยังต้องการให้ส่งเอกสารของคุณเป็นรูปแบบที่ถูกต้อง XML กับชนิด mime XML เช่นapplication/xhtml+xmlใน HTTP ส่วนหัวประเภทเนื้อหา (และไม่เป็นtext/html)

อย่างไรก็ตามการส่งชนิด mime XML จะทำให้หน้าเว็บของคุณไม่ได้ที่จะแยกวิเคราะห์โดย IE7 text/htmlซึ่งชอบ

จากw3 :

โดยสรุปแล้ว 'application / xhtml + xml' SHOULD จะใช้สำหรับเอกสารตระกูล XHTML และการใช้ 'text / html' SHOULD จะถูก จำกัด ไว้ที่เอกสาร XHTML 1.0 ที่เข้ากันได้กับ HTML อาจใช้ 'application / xml' และ 'text / xml' แต่ถ้าเหมาะสมก็ควรใช้ 'application / xhtml + xml' แทนประเภทสื่อ XML ทั่วไป

ฉันสับสนเมื่อไม่กี่เดือนที่ผ่านมาและวิธีแก้ปัญหาเดียวที่สามารถใช้งานได้ (เข้ากันได้กับ FF3 + และ IE7) คือการใช้<script></script>ไวยากรณ์เก่ากับtext/html(HTML syntax + HTML mimetype)

หากเซิร์ฟเวอร์ของคุณส่งtext/htmlประเภทในส่วนหัว HTTP แม้จะมีเอกสาร XHTML ที่มีรูปแบบถูกต้อง FF3 + จะใช้โหมดการแสดงผล HTML ซึ่งหมายความว่า<script />จะไม่ทำงาน (นี่เป็นการเปลี่ยนแปลง Firefox ก่อนหน้านี้เข้มงวดน้อยกว่า)

นี้จะเกิดขึ้นโดยไม่คำนึงถึงเล่นซอใด ๆ กับhttp-equivองค์ประกอบ meta ที่เปิดฉาก XML หรือประเภทเอกสารภายในเอกสารของคุณ - Firefox สาขาหนึ่งครั้งจะได้รับtext/htmlส่วนหัวที่กำหนดว่า HTML หรือ XML parser รูปลักษณ์ภายในเอกสารและ parser HTML <script />ไม่เข้าใจ


3
ถูกต้องหรือไม่ที่จะสรุปว่าหากคุณลดการรองรับ IE7 การส่งข้อความ / xml จะช่วยให้คุณได้รับการสนับสนุนเบราว์เซอร์ในวงกว้างสำหรับ <script />
Chris Moschini

7
ดังนั้นโดยย่อ <script /> จะทำงานเฉพาะเมื่อประเภท MIME ของหน้าเป็น xhtml / xml สำหรับหน้าข้อความ / html ปกติมันจะไม่ทำงาน และถ้าเราพยายามใช้ MIME ประเภท "xhtml / xml" มันจะทำให้ IE เข้ากันไม่ได้ ในการสรุปรักษาความสงบและใช้ <script> ... </script> ขอบคุณ Joe ;-)
Navin Israni

1
คำอธิบายที่ยอดเยี่ยม อีกประเด็นที่ควรสังเกตคือ Firefox จะมี.htmlไฟล์โลคอลแสดงผลเป็นแท็กซุปโดยไม่คำนึงถึงเมตาแท็กด้วยเหตุผลที่คล้ายกัน สำหรับไฟล์ XHTML Firefox จะแสดงผลตามนั้นหากตั้งชื่อ.xhtmlไว้
alecov

@ChrisMoschini น่าจะเป็น แต่ใช้ไม่ได้application/xhtml+xml text/xml
TRiG

166

ในกรณีที่มีใครอยากรู้อยากเห็นเหตุผลที่ดีที่สุดคือ HTML เดิมเป็นภาษาของ SGML ซึ่งเป็นพี่ชายแปลกประหลาดของ XML ใน SGML-land องค์ประกอบสามารถระบุได้ใน DTD เป็นทั้งการปิดตัวเอง (เช่น BR, HR, INPUT), ปิดได้โดยปริยาย (เช่น P, LI, TD) หรือปิดได้อย่างชัดเจน (เช่น TABLE, DIV, SCRIPT) แน่นอนว่า XML ไม่มีแนวคิดนี้

ตัวแยกวิเคราะห์แท็กซุปที่ใช้โดยเบราว์เซอร์ที่ทันสมัยวิวัฒนาการมาจากมรดกนี้แม้ว่ารูปแบบการแยกวิเคราะห์ของพวกเขาจะไม่บริสุทธิ์ SGML อีกต่อไป และแน่นอน XHTML ที่ออกแบบมาอย่างพิถีพิถันของคุณจะได้รับการปฏิบัติเหมือนแท็กซุปแรงบันดาลใจที่ไม่ดีของ SGML เว้นแต่คุณจะส่งด้วย XML mime นี่คือเหตุผลที่ ...

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

... ได้รับการตีความโดยเบราว์เซอร์เป็น:

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

... ซึ่งเป็นสูตรสำหรับข้อผิดพลาดที่น่ารักที่สามารถทำให้คุณหลงทางในขณะที่คุณลองใช้รหัสกับ DOM


4
ฉันอยากรู้. ทำไมเบราว์เซอร์เลือกที่จะตีความอย่างนั้น
Ahmed Aeon Axan

32
@AhmedAeonAxan: Pองค์ประกอบไม่สามารถมีDIVองค์ประกอบ (นี่คือ HTML ที่ไม่ถูกต้อง) ดังนั้นเบราว์เซอร์จะปิดองค์ประกอบโดยปริยายP (กำหนดเป็น "ปิดโดยนัย") ก่อนDIVแท็กเปิด อย่างไรก็ตามเบราว์เซอร์มีแนวโน้มที่จะทำงานแตกต่างกันในส่วนนี้
MrWhite

5
@ColeJohnson ไม่นี่ไม่ใช่แท็กซุป greim ทำการกวนชายแดนระหว่าง HTML ที่ถูกต้องและไม่ถูกต้อง Tag soup คือสิ่งที่คุณได้รับเมื่อผู้เขียนไม่สนใจกฎเพราะเบราว์เซอร์ใช้การแก้ไขข้อผิดพลาด </p>แท็กปิดท้ายที่ขาดหายไปนั้นเป็นส่วนหนึ่งของคำจำกัดความของ HTML!
นาย Lister

3
@MrLister - เรียงจาก "Tag soup" อธิบายวิธีแยกวิเคราะห์ HTML ไม่ใช่วิธีการเขียน มันเป็นคำที่ใช้อธิบายกลยุทธ์เบราว์เซอร์ที่แตกต่างกันซึ่งใช้เพื่อให้เข้าใจถึง HTML และย่อมาจากการแยกวิเคราะห์ XML ที่เข้มงวด การแยกวิเคราะห์ XML ได้รับอนุญาตเฉพาะประเภท XML mime แต่เนื่องจากไม่สามารถใช้งานได้อย่างกว้างขวางเบราว์เซอร์จึงกลับไปใช้รูปแบบ "tag soup" หลากหลายแม้กระทั่งเอกสารที่ถูกต้อง
greim

8
HTML5 ทำให้การแยกวิเคราะห์ 'tag soup' เป็นมาตรฐานจริงรวมถึงวิธีที่สอดคล้องกันในการจัดการมาร์กอัพที่ไม่ถูกต้อง ก่อนหน้านั้นเบราว์เซอร์จะต้องทราบว่าจะทำอย่างไรกับมาร์กอัปที่ไม่ถูกต้องด้วยตนเองทำให้เกิดความไม่สอดคล้องกัน ตัวแยกวิเคราะห์ HTML ในเบราว์เซอร์ปัจจุบันเป็นหนึ่งในซอฟต์แวร์ที่ทันสมัยที่สุดที่เคยเขียน เร็วอย่างเห็นได้ชัดและสามารถจัดการกับอินพุตส่วนใหญ่ใด ๆ สร้างผลลัพธ์ที่สอดคล้องกัน
Stijn de Witt

161

คนอื่น ๆ ได้ตอบว่า "อย่างไร" และสเป็คที่ยกมา นี่คือเรื่องราวจริงของ "ทำไมไม่<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และสเปคแนะนำให้กับพวกเขา

อย่างมีประสิทธิภาพแท็กที่สิ้นสุดด้วยตนเอง 'ที่ทำงาน' ทั้งหมดคือแท็กที่มีแท็กปิดท้ายที่ต้องห้ามในตัวแยกวิเคราะห์ที่ไม่สอดคล้องกับเทคนิคและอันที่จริงแล้วไม่ถูกต้อง มันเป็น 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>เป็นหนึ่งในแท็กที่การนำไปใช้งานต่างกัน มันใช้ในการทำงานใน Chrome, Safari , และ Opera ; ความรู้ของฉันมันไม่ทำงานใน Internet Explorer หรือ Firefox

นี้ถูกกล่าวถึงเมื่อ HTML 5 ได้ถูกร่างและได้ปฏิเสธเพราะมันแบ่ง เบราว์เซอร์ ที่เข้ากันได้ หน้าเว็บที่แท็กสคริปต์ปิดตัวเองอาจแสดงผลไม่ถูกต้อง (ถ้าทั้งหมด) ในเบราว์เซอร์เก่า มีข้อเสนออื่น ๆแต่พวกเขาไม่สามารถแก้ปัญหาความเข้ากันได้เช่นกัน

หลังจากร่างถูกนำออกใช้ WebKit จะปรับปรุง parser ให้สอดคล้องกัน

การปิดตัวเอง<script>ไม่ได้เกิดขึ้นใน HTML 5 เนื่องจากความเข้ากันได้ย้อนหลังกับ HTML 4 และ XHTML 1


XHTML 1 / XHTML 5

เมื่อมันทำหน้าที่เป็น XHTML, <script/>จะปิดจริงๆเป็นคำตอบอื่น ๆได้ระบุไว้

ยกเว้นว่าสเปคกล่าวว่ามันควรจะได้ทำงานเมื่อทำหน้าที่เป็น HTML:

เอกสาร XHTML ... อาจติดป้ายกำกับด้วยประเภทสื่ออินเทอร์เน็ต "text / html" [RFC2854] เนื่องจากเข้ากันได้กับเบราว์เซอร์ HTML ส่วนใหญ่

แล้วเกิดอะไรขึ้น?

มีคนถาม Mozillaเพื่อให้ Firefox แยกวิเคราะห์เอกสารตามXHTMLโดยไม่คำนึงถึงส่วนหัวของเนื้อหาที่ระบุ (รู้จักกันในชื่อการดมกลิ่นเนื้อหา ) สิ่งนี้จะได้รับอนุญาตให้สคริปต์ปิดตัวเองและการดมกลิ่นเนื้อหาเป็นสิ่งจำเป็นเพราะเว็บ hosters ยังไม่สุกพอที่จะให้บริการส่วนหัวที่ถูกต้อง; IE ทำได้ดีมาก

หากสงครามเบราว์เซอร์ครั้งแรกไม่ได้จบลงด้วย IE 6 XHTML อาจอยู่ในรายการด้วยเช่นกัน แต่มันก็จบลง และ IE 6 มีปัญหากับ XHTML ในความเป็นจริง IE ไม่สนับสนุนประเภท MIME ที่ถูกต้องเลยบังคับให้ทุกคนใช้text/htmlXHTML เพราะ IE ถือครองส่วนแบ่งการตลาดที่สำคัญตลอดทั้งทศวรรษ

และยังดมเนื้อหาอาจจะ ไม่ดีจริงๆและคนที่จะบอกว่ามันควรจะหยุด

ในที่สุดปรากฎว่า W3C ไม่ได้หมายถึง XHTML ที่จะดักจับได้ : เอกสารมีทั้ง HTML และ XHTML และContent-Typeกฎ หนึ่งสามารถกล่าวว่าพวกเขากำลังยืนอยู่ บริษัท เกี่ยวกับ "เพียงทำตามสเป็คของเรา" และไม่สนใจสิ่งที่เป็นในทางปฏิบัติ ข้อผิดพลาดที่ดำเนินต่อไปในรุ่น XHTML รุ่นที่ใหม่กว่า

อย่างไรก็ตามการตัดสินใจครั้งนี้ตัดสินเรื่องของ Firefox มันเป็น 7 ปีก่อนที่จะ Chrome เกิด ; ไม่มีเบราว์เซอร์ที่สำคัญอื่น ๆ ดังนั้นมันจึงตัดสินใจ

การระบุ doctype เพียงอย่างเดียวไม่ทำให้เกิดการแยกวิเคราะห์ XML เนื่องจากข้อกำหนดดังต่อไปนี้


1
@AndyE เมื่อคุณเขียน <script> ปิดตัวเองเบราว์เซอร์หลักในขณะนั้นไม่คิดว่าจะปิดและจะแยกวิเคราะห์ HTML ในรูปแบบของ javascript ทำให้ HTML5 ที่ถูกต้องทำลายเบราว์เซอร์เก่าเหล่านี้ ดังนั้นข้อเสนอถูกปฏิเสธ นี่คือคำอธิบายในรายการส่งเมล HTML5 ที่เชื่อมโยง
Sheepy

2
@AndyE: สิ่งที่คุณกำลังอธิบายคือการทำงานร่วมกันไปข้างหน้า - ความสามารถของรหัสเก่าที่จะทำงานกับคอมไพเลอร์ / ล่าม / parser ใหม่ ความเข้ากันได้ย้อนหลังคือความสามารถของรหัสใหม่ในการทำงานกับคอมไพเลอร์ / ล่าม / parser เก่า ดังนั้นใช่ความเข้ากันได้แบบย้อนหลังนั้นเป็นปัญหาเช่นเดียวกับหน้าที่เขียนด้วยข้อกำหนดใหม่ในใจจะไม่ทำงานในเบราว์เซอร์เก่า (และใช่มันเป็นประเพณีของการเขียนโปรแกรมเว็บเพื่อลองและสร้างรหัสใหม่ให้ทำงานในเบราว์เซอร์เก่า
slebetman

3
@Dmitry ความจริงก็คือการไม่อนุญาตให้สคริปต์ปิดตัวเองเป็นถนนเดินรถทางเดียว ในฐานะที่เชื่อมโยง <script> ที่ปิดตัวเองจะทำลายเบราว์เซอร์ทั้งหมดผู้ใช้จะเห็นหน้าว่าง - เกมคอนโซลอินเทอร์เน็ตทีวี IE 11 บนพีซี Win7 ขององค์กรใหม่รันไทม์ Javaหรือสมาร์ทโฟนนับพันล้านเครื่อง คุณสามารถอัพเกรด WebView เกือบทุกภาษาในอุปกรณ์ส่วนใหญ่ได้หรือไม่? หาก HTML5 พยายามว่าพวกเขาจะล้มเหลวเช่น XHTML2
Sheepy

6
คำตอบที่ประเมินค่าต่ำมาก
Kamil Tomšík

2
การแก้ไขเล็กน้อย: แท็กที่ดูเหมือนว่าทำงานเป็นตัวปิดเองใน HTML ไม่ใช่แท็กที่มีแท็กปิดท้ายที่เป็นทางเลือกแต่แท็กที่มีแท็กปิดท้ายที่ต้องห้าม (แท็กที่ว่างเปล่าหรือโมฆะ) แท็กที่มีแท็กปิดท้ายที่เป็นตัวเลือกเช่น<p>หรือ<li>ไม่สามารถ 'ปิดตัวเอง' เนื่องจากสามารถมีเนื้อหาได้ดังนั้นโค้ดเช่น<p/>นี้จึงไม่มีอะไรเพิ่มเติมที่แท็กเริ่มต้น (ผิดรูปแบบ) และเนื้อหาหลังจากนั้นหากได้รับอนุญาตในองค์ประกอบนี้ จะลงเอยข้างใน
Ilya Streltsyn

44

Internet Explorer 8 และรุ่นก่อนหน้าไม่รองรับการแยกวิเคราะห์ XHTML แม้ว่าคุณจะใช้การประกาศ XML และ / หรือ XHTML Doctype แต่ IE เก่ายังคงแยกวิเคราะห์เอกสารเป็น HTML ธรรมดา และใน HTML ธรรมดาไม่สนับสนุนไวยากรณ์การปิดตนเอง เครื่องหมายสแลชต่อท้ายเพิ่งถูกละเว้นคุณต้องใช้แท็กปิดที่ชัดเจน

แม้แต่เบราว์เซอร์ที่รองรับการแยกวิเคราะห์ XHTML เช่นIE 9 และใหม่กว่าจะยังคงแยกวิเคราะห์เอกสารเป็น HTML เว้นแต่ว่าคุณจะให้บริการเอกสารที่มีประเภทเนื้อหา XML แต่ในกรณีนั้น IE เก่าจะไม่แสดงเอกสารเลย!


9
"IE ไม่รองรับการแยกวิเคราะห์ XHTML" เป็นจริงสำหรับรุ่น IE ในขณะที่เขียน แต่ไม่เป็นความจริงอีกต่อไป
EricLaw

@EricLaw คุณสามารถชี้แจงรุ่นของ IE ที่แก้ไขได้หรือไม่ (และเงื่อนไขเฉพาะ - เช่นประเภทเอกสารที่ถูกต้อง)
scunliffe

2
@scunliffe IE9 เป็นรุ่นแรกที่ได้รับการสนับสนุนอย่างเต็มที่สำหรับ XHTML blogs.msdn.com/b/ie/archive/2010/11/01/…
EricLaw

28

ผู้คนข้างต้นได้อธิบายปัญหานี้ไว้แล้ว แต่สิ่งหนึ่งที่อาจทำให้สิ่งต่าง ๆ ชัดเจนก็คือแม้ว่าผู้ใช้<br/>และตลอดเวลาในเอกสาร HTML ทุกคน/ในตำแหน่งดังกล่าวจะถูกเพิกเฉยและใช้เฉพาะเมื่อพยายามทำ บางสิ่งบางอย่างแยกวิเคราะห์เป็น XML และ HTML <p/>foo</p>ตัวอย่างเช่นลองและคุณจะได้รับย่อหน้าปกติ


22

แท็กสคริปต์ปิดตัวเองจะไม่ทำงานเนื่องจากแท็กสคริปต์สามารถมีรหัสแบบอินไลน์และ HTML นั้นไม่ฉลาดพอที่จะเปิดหรือปิดคุณลักษณะนั้นตามการมีอยู่ของแอตทริบิวต์

ในทางกลับกัน HTML มีแท็กที่ยอดเยี่ยมสำหรับการรวมการอ้างอิงถึงแหล่งข้อมูลภายนอก: <link>แท็กและสามารถปิดได้ด้วยตนเอง มันถูกใช้แล้วเพื่อรวมสไตล์ชีตฟีด RSS และ Atom, Canonical URIs และสินค้าอื่น ๆ อีกมากมาย ทำไมไม่ใช้ JavaScript

หากคุณต้องการให้แท็กสคริปต์ล้อมรอบตัวเองคุณไม่สามารถทำอย่างที่ฉันพูดได้ แต่มีทางเลือกอื่นแม้ว่าไม่ใช่สมาร์ทแท็ก คุณสามารถใช้แท็กปิดลิงก์และลิงก์ไปยัง JavaScript ของคุณโดยกำหนดประเภทของข้อความ / จาวาสคริปต์และเชื่อมต่อเป็นสคริปต์ซึ่งมีลักษณะดังนี้:

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

4
ฉันชอบสิ่งนี้ทำไมถึงไม่ "ฉลาด" ด้วย?
Josh M.

5
เนื่องจากมีแท็กสคริปต์ที่กำหนดไว้ล่วงหน้าเพื่อให้สามารถโหลดสคริปต์ได้อย่างแม่นยำ .. ทำไมคุณต้องสับสนเรื่องการใช้สิ่งอื่น ค้อนค้อนในเล็บ .. มันจะฉลาดถ้าจะใช้รองเท้า?
Dave Lawrence

8
@daveL - และเรามี <style>แท็ก แต่ยังใช้แท็กลิงก์สำหรับไฟล์ CSS ภายนอก คำจำกัดความของแท็กลิงก์: "แท็ก<link> กำหนดลิงค์ระหว่างเอกสารและทรัพยากรภายนอก" ดูเหมือนว่ามีเหตุผลอย่างสมบูรณ์ว่าแท็กลิงก์จะใช้สำหรับ CSS หรือ JS ภายนอก ... นั่นคือสิ่งที่มันใช้สำหรับ ... การลิงก์ในไฟล์ภายนอก หมายเหตุฉันไม่ได้พูดถึง spec / cross-browserness / etc ฉันแค่แสดงความคิดเห็นเกี่ยวกับลักษณะเชิงตรรกะของการใช้แท็กลิงก์เพื่อนำทั้ง CSS และ JS ... จริง ๆ แล้วมันจะสมเหตุสมผลถ้ามันเป็นอย่างนั้น . ไม่แน่ใจว่ารองเท้า [คล้ายคลึง] พอดี
Jimbo Jonny

20

ซึ่งแตกต่างจาก XML และ XHTML, HTML ไม่มีความรู้เกี่ยวกับไวยากรณ์ปิดตัวเอง เบราว์เซอร์ที่ตีความ XHTML ในรูปแบบ HTML ไม่ทราบว่า/ตัวอักษรบ่งชี้ว่าแท็กควรปิดตัวเอง แต่พวกเขาตีความเหมือนแอตทริบิวต์ที่ว่างเปล่าและ parser ยังคงคิดว่าแท็กคือ 'เปิด'

เช่นเดียวกับที่<script defer>จะถือว่าเป็น<script defer="defer">, จะถือว่าเป็น<script /><script /="/">


33
สง่างามตามคำอธิบายนี้จริง ๆ แล้วมันผิด หากเป็นจริงจะมีแอตทริบิวต์ "/" สำหรับองค์ประกอบสคริปต์ใน DOM ฉันได้ตรวจสอบ IE, Firefox และ Opera และไม่มีสิ่งใดที่มีแอตทริบิวต์ดังกล่าว
Alohci

11
/ ไม่ใช่อักขระชื่อแอตทริบิวต์ที่ถูกต้องดังนั้นจึงถูกละทิ้ง มิฉะนั้นคำอธิบายนี้ค่อนข้างชัดเจน
hallvors - เรียกคืนโมนิกา

1
อันที่จริงแล้วตัวแยกวิเคราะห์ HTML บางตัว (และโดยเฉพาะตัวตรวจสอบความถูกต้อง) อาจตีความ/ว่าเป็นส่วนหนึ่งของการสร้าง NET (Null End Tag)
IllidanS4 ต้องการโมนิก้ากลับ

18

Internet Explorer 8 และรุ่นเก่าไม่สนับสนุนชนิด MIME ที่เหมาะสมสำหรับ application/xhtml+xmlXHTML, หากคุณให้บริการ XHTML ในฐานะtext/htmlที่คุณต้องทำเพื่อให้ Internet Explorer รุ่นเก่าเหล่านี้ทำสิ่งใดมันจะถูกตีความเป็น HTML 4.01 คุณสามารถใช้ไวยากรณ์สั้น ๆ กับองค์ประกอบที่อนุญาตให้ละเว้นแท็กปิดเท่านั้น ดูข้อมูลจำเพาะ HTML 4.01จำเพาะ

XML 'รูปแบบย่อ' ถูกตีความว่าเป็นชื่อ / ซึ่ง (เนื่องจากไม่มีเครื่องหมายเท่ากับ) ถูกตีความว่ามีค่าโดยนัยของ "/" นี่เป็นความผิดอย่างเคร่งครัดใน HTML 4.01 - ไม่อนุญาตให้มีแอตทริบิวต์ที่ไม่ได้ประกาศ แต่เบราว์เซอร์จะไม่สนใจ

IE9 และต่อมาสนับสนุน XHTML 5application/xhtml+xmlเสิร์ฟกับ


IE 9 รองรับ XHTMLและ IE ไม่เกิน 51% คุณสามารถปรับปรุงคำตอบของคุณ?
Damian Yerrick

5

นั่นเป็นเพราะแท็กสคริปต์ไม่ใช่โมฆะองค์ประกอบ

ในเอกสาร HTML - องค์ประกอบที่เป็นโมฆะไม่จำเป็นต้องมี "แท็กปิด" เลย!

ในxhtmlทุกอย่างคือ Generic ดังนั้นพวกเขาทุกคนต้องการการสิ้นสุดเช่น "แท็กปิด"; รวมถึง br, ตัวแบ่งบรรทัดแบบง่าย ๆ , <br></br>หรือชวเลข <br />ชวเลข

อย่างไรก็ตามองค์ประกอบของสคริปต์ไม่เคยเป็นโมฆะหรือองค์ประกอบตามตัวอักษรเพราะแท็กสคริปต์ก่อนสิ่งอื่นใดคือคำสั่งเบราว์เซอร์ไม่ใช่การประกาศคำอธิบายข้อมูล

โดยหลักแล้ว Seminary Termination Instruction เช่น "แท็กปิด" เป็นสิ่งจำเป็นสำหรับการประมวลผลคำสั่งที่ไม่สามารถยกเลิกความหมายของแท็กที่ประสบความสำเร็จ ตัวอย่างเช่น

<H1>ซีแมนทิกส์ไม่สามารถยกเลิกได้โดยต่อไปนี้<P>เพราะมันมีความหมายไม่เพียงพอที่จะแทนที่ดังนั้นจึงยกเลิกชุดคำสั่ง H1 ก่อนหน้านี้ แม้ว่าจะสามารถแยกสตรีมเป็นบรรทัดย่อหน้าใหม่ได้ แต่ก็ไม่ "แข็งแกร่งพอ" เพื่อแทนที่ขนาดแบบอักษรปัจจุบันและความสูงของบรรทัดสไตล์ที่เทลงในสตรีมนั่นคือการรั่วไหลจาก H1 (เนื่องจาก P ไม่มี )

นี่คือวิธีและสาเหตุที่มีการคิดค้นการส่งสัญญาณ "/" (การเลิกจ้าง)

แท็กสิ้นสุดแบบไม่มีคำอธิบายทั่วไป< />จะพอเพียงสำหรับการหลุดจากน้ำตกที่พบเช่น: <H1>Title< />แต่นั่นไม่ใช่กรณีเสมอไปเพราะเรายังต้องการความสามารถในการ "ซ้อน" แท็กตัวกลางหลายรายการของสตรีม: แยก เป็น torrents ก่อนที่จะห่อ / ตกลงบนน้ำตกอื่น เป็นผลให้เครื่องปลายทางทั่วไปเช่น< />จะไม่สามารถกำหนดเป้าหมายของทรัพย์สินที่จะยุติ ตัวอย่างเช่น<b>ตัว <i>หนาตัว < /> เอียง หนาตัวเอียง</>ปกติ ไม่ต้องสงสัยเลยว่าจะไม่ได้รับความตั้งใจของเราและส่วนใหญ่อาจตีความว่าเป็นตัวหนาตัวหนามันเป็นตัวหนาปกติ

นี่คือความคิดของกระดาษห่อหุ้มเช่น. ภาชนะเกิด (ความคิดเหล่านี้จึงคล้ายกันว่ามันเป็นไปไม่ได้ที่จะมองเห็นและบางครั้งองค์ประกอบเดียวกันอาจมีทั้ง. <H1>เป็นทั้งเสื้อคลุมและภาชนะในเวลาเดียวกัน. ในขณะที่<B>มีเพียงเสื้อคลุมความหมาย) เราจะต้องใช้แบบธรรมดาไม่มีคอนเทนเนอร์แบบซีแมนทิกส์ และแน่นอนว่าการประดิษฐ์องค์ประกอบ DIV นั้นเกิดขึ้น

องค์ประกอบ DIV เป็นจริง 2BR คอนเทนเนอร์ แน่นอนว่าการมาถึงของ CSS ทำให้สถานการณ์ทั้งหมดเลวร้ายลงกว่าที่เคยเป็นมาและทำให้เกิดความสับสนอย่างมากกับผลที่ตามมามากมาย - ทางอ้อม!

เพราะด้วย CSS คุณสามารถแทนที่การทำงานก่อนและหลัง BR แบบดั้งเดิมของ DIV ที่คิดค้นขึ้นใหม่ได้อย่างง่ายดายจึงมักถูกอ้างถึงว่าเป็น "do nothing container" ซึ่งเป็นสิ่งที่ผิดธรรมชาติ! DIVs เป็นองค์ประกอบบล็อกและจะแบ่งบรรทัดของสตรีมทั้งก่อนและหลังการส่งสัญญาณสิ้นสุด ในไม่ช้าเว็บก็เริ่มทุกข์ทรมานจากหน้า DIV-itis ส่วนใหญ่ยังคงเป็น

การมาถึงของ CSS ที่มีความสามารถในการแทนที่อย่างสมบูรณ์และกำหนดพฤติกรรมดั้งเดิมของแท็ก HTML ใด ๆ ได้อย่างสมบูรณ์จัดการอย่างใดอย่างหนึ่งเพื่อสร้างความสับสนและเบลอความหมายทั้งหมดของการดำรงอยู่ของ HTML ...

ทันใดนั้นแท็ก HTML ทั้งหมดปรากฏราวกับว่าล้าสมัยแท็กเหล่านั้นจะถูกลบออกโดยแยกความหมายดั้งเดิมเอกลักษณ์และวัตถุประสงค์ออกทั้งหมด ยังไงก็เถอะคุณจะได้รับความประทับใจที่พวกเขาไม่ต้องการอีกต่อไป พูดว่า: แท็กตัวบรรจุคอนเทนเนอร์เดียวจะพอเพียงสำหรับการนำเสนอข้อมูลทั้งหมด เพียงเพิ่มคุณสมบัติที่จำเป็น ทำไมไม่มีแท็กที่มีความหมายแทน ประดิษฐ์ชื่อแท็กในขณะที่คุณไปและปล่อยให้ CSS รบกวนส่วนที่เหลือ

นี่คือวิธีที่ xhtml เกิดและแน่นอนว่าเป็นทู่ที่ยอดเยี่ยมซึ่งได้รับค่าตอบแทนอย่างสุดซึ้งจากผู้มาใหม่และวิสัยทัศน์ที่บิดเบี้ยวว่าอะไรคืออะไรและอะไรคือจุดประสงค์ของมันทั้งหมด W3C เปลี่ยนจาก World Wide Web เป็น What Went Wrong, Comrades? !!

วัตถุประสงค์ของ HTML คือการสตรีมข้อมูลที่มีความหมายไปยังผู้รับที่เป็นมนุษย์

เพื่อส่งข้อมูล

ส่วนที่เป็นทางการอยู่ที่นั่นเพื่อช่วยให้ความชัดเจนของการส่งข้อมูลเท่านั้น xhtml ไม่ได้ให้ข้อมูลใด ๆ กับการพิจารณาเพียงเล็กน้อย - ข้อมูลนั้นไม่เกี่ยวข้องอย่างแน่นอน

สิ่งที่สำคัญที่สุดในเรื่องนี้คือการรู้และสามารถเข้าใจได้ว่าxhtml ไม่ได้เป็นเพียงแค่เวอร์ชันของ HTML แบบขยายบางส่วน xhtml เป็นสัตว์ร้ายที่แตกต่างอย่างสิ้นเชิง บริเวณขึ้น; และดังนั้นจึงเป็นการดีที่จะแยกพวกเขาออกจากกัน


3

ความแตกต่างระหว่าง 'XHTML จริง', 'มารยาท XHTML และ HTML เช่นเดียวกับความสำคัญของเซิร์ฟเวอร์ส่งชนิดไมม์ได้รับการอธิบายไว้แล้วที่นี่เป็นอย่างดี หากคุณต้องการทดลองใช้ในตอนนี้นี่เป็นตัวอย่างข้อมูลที่แก้ไขได้ง่ายพร้อมแสดงตัวอย่างแบบสดรวมถึงแท็กสคริปต์แบบปิดตัวเองสำหรับเบราว์เซอร์ที่มีคุณสมบัติ:

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!ด้านล่าง

สำหรับเบราว์เซอร์ที่ไม่มีความสามารถคุณสามารถคัดลอกเนื้อหาของ textarea และบันทึกเป็นไฟล์ที่มีนามสกุล.xhtml(หรือ.xht) ( ขอบคุณ Alek สำหรับคำแนะนำนี้ )


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.