แท็กที่ปิดตัวเอง (ไม่เป็นโมฆะ) ใช้ได้กับ HTML5 หรือไม่


670

เครื่องมือตรวจสอบ W3Cไม่ชอบแท็กปิดตัวเอง (แท็กที่ลงท้ายด้วย " />") ในองค์ประกอบที่ไม่เป็นโมฆะ (องค์ประกอบที่เป็นโมฆะเป็นองค์ประกอบที่อาจไม่เคยมีเนื้อหาใด ๆ ) พวกเขายังคงใช้งานได้ใน HTML5 หรือไม่?

ตัวอย่างขององค์ประกอบโมฆะที่ยอมรับได้ :

<br />
<img src="" />
<input type="text" name="username" />

ตัวอย่างบางส่วนขององค์ประกอบที่ไม่ใช่โมฆะถูกปฏิเสธ :

<div id="myDiv" />
<span id="mySpan" />
<textarea id="someTextMessage" />

หมายเหตุ:
ตัวตรวจสอบความถูกต้อง W3C ยอมรับแท็กปิดตัวเองเป็นโมฆะ: ผู้เขียนมีปัญหาเนื่องจากการพิมพ์ผิดปกติ ( \>แทน/>); อย่างไรก็ตามแท็กที่ปิดตัวเองนั้นใช้ไม่ได้ 100% ใน HTML5 โดยทั่วไปและคำตอบที่อธิบายรายละเอียดเกี่ยวกับปัญหาของแท็กที่ปิดตัวเองในรสชาติ HTML ต่างๆ


2
@Ben: โอ้ขอโทษฉันคิดว่าคุณพูดถูก ในกรณีนี้ฉันเข้าใจผิดคำถามเดิมฉันคิดว่า OP ต้องการทราบว่าแท็กปิดตัวเองใช้ได้กับ HTML5 หรือไม่ แต่นั่นหมายความว่าเขาเพิ่งพิมพ์ผิดในรหัสของเขาหรือเขาไม่รู้วิธีการเขียนแท็กปิดตัวเองอย่างเหมาะสมซึ่งทำให้ผู้ตรวจสอบความถูกต้องของ W3C ทำเครื่องหมายว่ารหัสของเขาไม่ถูกต้อง
Sk8erPeter

16
เพื่อประหยัดเวลาสำหรับผู้อ่านในอนาคต: ใช่ไวยากรณ์ในคำถามไม่ถูกต้องและไม่คุณไม่ควรเปลี่ยน สหกรณ์มีอย่างชัดเจนและอธิบายแก้ตัวทำไม เนื่องจากทำให้เกิดข้อผิดพลาดในการตรวจสอบความถูกต้องซึ่งทำให้เกิดคำถามนี้จึงไม่ควรแก้ไขไวยากรณ์
Jordan Gray

2
คุณเป็นคนที่ยังคงต่อสู้กับทิศทางที่ทับหน้าควรจะเผชิญกับ? มาเลย
BoltClock

3
@BoltClock Yup ยังคงต่อสู้ Guys: ถ้าคำถามนี้ถาม\>ก็ควรจะปิดเป็นคำถาม fix-my-typo ที่ไร้ประโยชน์ />คำตอบอยู่ทั้งหมด />รุ่นเป็นประโยชน์เพียงคนเดียว ช่างมันเถอะ.
Gilles 'SO- หยุดความชั่วร้าย'

1
จากนั้นคำถามจะต้องถูก reworded เนื่องจากเครื่องมือตรวจสอบ W3C ยอมรับแท็กปิดตัวเองได้จริง เป็นการยากที่จะตั้งคำถามใหม่ในลักษณะดังกล่าวโดยไม่สูญเสียความซื่อตรงต่อความตั้งใจดั้งเดิม ดังนั้นถ้าเราต้องการที่จะปฏิบัติตามกฎของ SO เราอาจต้องเสียสละความชัดเจนในคำถามเช่นนี้แม้ว่ามันจะดูเหมือนว่าการแก้ไขคำถามเป็นสิ่งที่เหมาะสมที่จะทำเพื่อประโยชน์ที่ดีกว่า เฉลี่ย. เราสามารถเริ่มการสนทนาอีกครั้งเกี่ยวกับเมตาหากมีคำถามอื่น ๆ อีกมากมายที่เป็นปัญหาที่คล้ายกัน
osa

คำตอบ:


1238
  • ในHTML 4 , <foo /(ใช่ไม่มี>เลย) หมายถึง<foo>(ซึ่งนำไปสู่<br />ความหมาย<br>>(คือ<br>&gt;) และ<title/hello/ความหมาย<title>hello</title>) นี้เป็นSGMLกฎที่เบราว์เซอร์ได้งานที่ดีมากในการสนับสนุนและสเป็คให้คำแนะนำแก่ผู้เขียนที่จะหลีกเลี่ยงไวยากรณ์

  • ในXHTML , วิธีการ<foo /> <foo></foo>นี่เป็นกฎXMLที่ใช้กับเอกสาร XML ทั้งหมด ที่กล่าวว่า XHTML มักจะทำหน้าที่เป็นtext/htmlที่ (อดีตอย่างน้อย) application/xhtml+xmlได้รับการประมวลผลโดยใช้เบราว์เซอร์ตัวแยกวิเคราะห์ที่แตกต่างจากเอกสารที่ทำหน้าที่เป็น ของ W3C ให้แนวทางการทำงานร่วมกันที่จะปฏิบัติตามสำหรับ XHTML text/htmlเป็น (พื้นฐาน: ใช้ไวยากรณ์แท็กปิดตัวเองเฉพาะเมื่อองค์ประกอบถูกกำหนดเป็นว่างเปล่า (และแท็กสิ้นสุดถูกห้ามในข้อมูลจำเพาะ HTML))

  • ในHTML5ความหมายของขึ้นอยู่กับชนิดขององค์ประกอบ<foo />

    • ในองค์ประกอบ HTML ที่ถูกกำหนดให้เป็นองค์ประกอบโมฆะ (เป็นหลัก "องค์ประกอบที่มีอยู่ก่อน HTML5 และสิ่งต้องห้ามที่มีเนื้อหาใด ๆ ") แท็กปิดท้ายจะถูกห้ามเพียงแค่ อนุญาตให้ใช้เครื่องหมายทับที่ส่วนท้ายของแท็กเริ่มต้น แต่ไม่มีความหมาย มันเป็นเพียงน้ำตาล syntactic สำหรับคน (และเน้นข้อความเน้นข้อความ) ที่ติด XML
    • ในองค์ประกอบ HTML อื่น ๆ เครื่องหมายทับเป็นข้อผิดพลาด แต่การกู้คืนข้อผิดพลาดจะทำให้เบราว์เซอร์ละเว้นและถือว่าแท็กเป็นแท็กเริ่มต้นปกติ ซึ่งมักจะจบลงด้วยแท็กปิดท้ายที่หายไปทำให้องค์ประกอบที่ตามมาเป็นลูกแทนที่จะเป็นพี่น้อง
    • องค์ประกอบภายนอก (นำเข้าจากแอปพลิเคชัน XML เช่น SVG) ถือว่าเป็นไวยากรณ์ที่ปิดตัวเอง

24
" ... ใครติด XML " คุณดูเหมือนจะแนะนำว่าการปฏิบัติตาม XML ไม่ถูกต้อง แต่ผลลัพธ์สุดท้ายใน HTML5 ดูเหมือนว่าเรายังคงต้องจัดการกับวงเล็บเหลี่ยมมุมอยู่ดี (เช่นสิ่งที่มีความไม่สะดวกส่วนใหญ่ของ XML) ในขณะที่มันทำให้การใช้เครื่องมือที่ใช้ XML เป็นเรื่องยากขึ้น (เช่นเครื่องมือเทมเพลตหรือโปรเซสเซอร์ต่างๆ ) แม้จากมุมมองของการสร้างมันก็ดูเหมือนว่า<object data="..." />และ<img src="..."></src>ไม่เป็นไรในขณะที่<object data="..."></object>และ<img src="..." />เป็นซึ่งทำให้มันยากขึ้นสำหรับความสอดคล้องของเครื่องมือ ดูเหมือนว่าจะเป็นสถานการณ์ที่แพ้
บรูโน่

7
@Bruno - HTML มีการถือกำเนิดของ XML ความพยายามในการทำให้ผู้คนย้ายไปที่ XHTML ล้มเหลว ด้วยtext/htmlเบราว์เซอร์ไม่ได้ให้ความหมายพิเศษใด ๆ กับเครื่องหมายทับดังนั้นรวมถึงไม่มีวัตถุประสงค์ที่ใช้งานได้จริง มีเพียงเพื่อให้ดูเหมือน XML สำหรับผู้ที่ไม่สามารถออกจากนิสัย
เควนติน

6
@Quentin ฉันไม่เห็นด้วยอย่างสิ้นเชิง ฉันเพิ่งพบว่าเป็นเรื่องน่าละอายใจที่การเทียบเท่า XML ที่ถูกต้องนั้นไม่จำเป็นต้องเป็น HTML5 ที่ถูกต้อง (เช่น<img ...></img>แทนที่จะเป็น<img ...>หรือ<img ... />) เนื่องจาก HTML5 นั้นมีความเข้มงวดน้อยกว่าโดยทั่วไป (อาจเป็นสาเหตุว่าทำไม XHTML ล้มเหลว) จึงเป็นไปได้ที่จะยอมรับบางสิ่งบางอย่างได้เป็นอย่าง<img ...></img>ดี น่าเสียดายที่มันไม่ได้ดังนั้นตัวสร้างเท็มเพลตที่ใช้ XML จำเป็นต้องรู้วิธีแยกแยะการผลิตองค์ประกอบที่เป็นโมฆะหรือองค์ประกอบที่ปิดตัวเอง: คุณไม่สามารถมีกฎเดียวที่จะบอกว่าเขียนองค์ประกอบที่ว่างเปล่าทั้งหมด<tag></tag>ได้
บรูโน่

3
XHTML ล้มเหลวก่อน HTML 5 ได้แม้บนขอบฟ้าและคุณไม่สามารถมีความยาวในรูปแบบองค์ประกอบว่างเปล่าเพราะแก้ไขข้อผิดพลาดที่เบราว์เซอร์ฟิก XHTML จะทำสิ่งต่างๆเช่นการรักษา</br>เป็น<br>เช่นนั้น<br></br>จะเป็นเส้นแบ่งคู่ (และย้อนกลับเข้ากันได้กับมาร์กอัปที่ไม่ดีในโลกแห่งความเป็นจริง</br>เป็นหนึ่งในเป้าหมายการออกแบบของ HTML 5)
Quentin

1
จาก W3C: องค์ประกอบโมฆะ: พื้นที่, ฐาน, br, col, ฝัง, ชั่วโมง, img, อินพุต, keygen, ลิงก์, เมตา, พารามิเตอร์, แหล่งที่มา, แทร็ก, wbr "องค์ประกอบโมฆะมีแท็กเริ่มต้นเท่านั้นไม่ต้องระบุแท็กสิ้นสุด สำหรับองค์ประกอบที่เป็นโมฆะ " w3.org/TR/html5/syntax.html#void-elements
Fabio Nolasco

406

ดังที่ Nikita Skvortsov ชี้ให้เห็น div ที่ปิดตัวเองจะไม่ตรวจสอบความถูกต้อง เพราะนี่คือ div เป็นองค์ประกอบปกติไม่ได้เป็นองค์ประกอบที่เป็นโมฆะ

ตามข้อมูลจำเพาะ HTML5แท็กที่ไม่สามารถมีเนื้อหาใด ๆ (เรียกว่าองค์ประกอบโมฆะ ) สามารถปิดตัวเองได้ * ซึ่งรวมถึงแท็กต่อไปนี้:

area, base, br, col, embed, hr, img, input, 
keygen, link, meta, param, source, track, wbr

"/" เป็นตัวเลือกอย่างสมบูรณ์บนแท็กด้านบนดังนั้นจึง<img/>ไม่แตกต่างจาก<img>แต่<img></img>ไม่ถูกต้อง

* หมายเหตุ: องค์ประกอบต่างประเทศสามารถปิดตัวเองได้ แต่ฉันไม่คิดว่ามันอยู่ในขอบเขตสำหรับคำตอบนี้


1
เครื่องมือสำหรับนักพัฒนาของ IE10 กำลังให้ฉัน "HTML1500: แท็กไม่สามารถปิดตัวเองได้ใช้แท็กปิดที่ชัดเจน" ในบรรทัด <meta charset = "UTF-8" /> ความคิดใดที่เป็นเช่นนั้น
James ในอินดี้

ตกลงฉันพบว่าแท็กปิดตัวเองไม่ควรมีเครื่องหมายทับ (และลบออกเพื่อแก้ไขข้อผิดพลาดของฉัน) อ้างอิง: tiffanybbrown.com/2011/03/23/…
James in Indy

ข้อมูลจำเพาะมีการเปลี่ยนแปลง ตอนนี้องค์ประกอบ "โมฆะ" หรือ "ปิดตัวเอง" ไม่ควรรวมเครื่องหมายสแลชเมื่อใช้เป็นประเภท HTML 5 อย่างไรก็ตามหากมีการแสดงผลเป็น XHTML อาจต้องใช้เครื่องหมายทับปิด (ตรวจสอบเอกสารในกรณีนี้) ในการใช้งานจริงมักจะแสดงหน้าตามที่คาดไว้แม้ว่าจะรวมการปิด/แต่ไม่ได้รับประกัน (ขึ้นอยู่กับเบราว์เซอร์การเขียนรหัสใหม่สำหรับคุณอย่างมีประสิทธิภาพ ด้วยเหตุผลบางประการที่หน้าของคุณจะต้องผ่านการตรวจสอบ HTML 5 อาจไม่ผ่านหากคุณปิดแท็กสำหรับองค์ประกอบที่เป็นโมฆะ
SherylHohman

เกี่ยวกับความคิดเห็นของ @ SherylHohman ฉันไม่เชื่อว่าข้อมูลจำเพาะมีการเปลี่ยนแปลง (หรือถ้ามีมันเปลี่ยนไปแล้ว) ดูw3.org/TR/html5/syntax.html#start-tags (8.1.2.1.6) - องค์ประกอบโมฆะ (หรือต่างประเทศ) อาจยังรวมถึงเครื่องหมายทับ
ChrisC

63

ในทางปฏิบัติการใช้แท็กปิดตัวเองใน HTML ควรใช้งานได้ตามที่คุณคาดหวัง แต่ถ้าคุณกังวลเกี่ยวกับการเขียนHTML5 ที่ถูกต้องคุณควรเข้าใจว่าการใช้แท็กดังกล่าวทำงานอย่างไรในรูปแบบไวยากรณ์สองแบบที่แตกต่างกันสองแบบที่คุณสามารถใช้ได้ HTML5 กำหนดทั้งไวยากรณ์ HTML และไวยากรณ์ XHTML ซึ่งคล้ายกัน แต่ไม่เหมือนกัน ประเภทใดที่ใช้จะขึ้นอยู่กับประเภทสื่อที่ส่งโดยเว็บเซิร์ฟเวอร์

มากกว่าที่เป็นไปได้ว่าหน้าเว็บของคุณกำลังแสดงผลtext/htmlซึ่งทำตามไวยากรณ์ HTML ที่ผ่อนปรนมากขึ้น ในกรณีเหล่านี้ HTML5 อนุญาตให้แท็กเริ่มต้นบางตัวมี / เป็นตัวเลือกก่อนที่จะยกเลิก> ในกรณีเหล่านี้ / เป็นทางเลือกและละเว้นดังนั้น<hr>และ<hr />เหมือนกัน ข้อมูลจำเพาะ HTML เรียก "องค์ประกอบโมฆะ" เหล่านี้และให้รายการของวัตถุที่ถูกต้อง การพูดอย่างเคร่งครัดตัวเลือก / จะใช้ได้ภายในแท็กเริ่มต้นขององค์ประกอบโมฆะเหล่านี้เท่านั้น ตัวอย่างเช่น<br />และ<hr />เป็น HTML5 ที่ถูกต้อง แต่<p />ไม่ใช่

ข้อมูลจำเพาะ HTML5 สร้างความแตกต่างที่ชัดเจนระหว่างสิ่งที่ถูกต้องสำหรับผู้เขียน HTML และสำหรับนักพัฒนาเว็บเบราว์เซอร์โดยกลุ่มที่สองจะต้องยอมรับไวยากรณ์ "ดั้งเดิม" ที่ไม่ถูกต้องทุกชนิด ในกรณีนี้หมายความว่าเบราว์เซอร์ที่ใช้ HTML5 จะยอมรับแท็กปิดตัวเองที่ผิดกฎหมายเช่น<p />และแสดงผลตามที่คุณคาดหวัง แต่สำหรับผู้เขียนหน้านั้นจะไม่ถูกต้อง HTML5 (ที่สำคัญกว่านั้นคือ DOM ทรีที่คุณได้รับจากการใช้ไวยากรณ์ผิดกฎหมายประเภทนี้สามารถถูกทำให้ผิดพลาดได้อย่างรุนแรง<span />เช่นแท็กที่ปิดตัวเองเช่นมีแนวโน้มที่จะทำสิ่งต่าง ๆเป็นจำนวนมาก )

(ในกรณีที่ผิดปกติที่เซิร์ฟเวอร์ของคุณรู้วิธีส่งไฟล์ XHTML เป็นประเภท XML MIME หน้าจะต้องสอดคล้องกับ XHTML DTD และไวยากรณ์ XML ซึ่งหมายความว่าจำเป็นต้องใช้แท็กปิดตัวเองสำหรับองค์ประกอบที่กำหนดเช่นนี้)


31
<p /> จะถือว่าเป็นแท็กเปิดไม่ใช่แท็กปิดตัวเอง นั่นหมายถึงส่วนที่เหลือทั้งหมดของเอกสารจะถือว่าเป็นองค์ประกอบ P นั่นไม่ใช่สิ่งที่ฉัน "อาจคาดหวัง" และจะสร้างความยุ่งเหยิงอย่างร้ายแรงในหน้าเว็บที่ไม่สำคัญ
ช่างตีเหล็ก

12

HTML5 โดยทั่วไปจะทำงานราวกับว่ามีการทับส่วนท้ายไม่ได้อยู่ที่นั่น ไม่มีแท็กปิดตัวเองในไวยากรณ์ HTML5

  • แท็กปิดตัวเองเมื่อไม่เป็นโมฆะองค์ประกอบเช่น<p/>, <div/>จะไม่ทำงานเลย เครื่องหมายสแลชต่อท้ายจะถูกละเว้นและสิ่งเหล่านี้จะถือเป็นแท็กเปิด สิ่งนี้มีแนวโน้มที่จะนำไปสู่ปัญหาการซ้อน

    นี่เป็นเรื่องจริงโดยไม่คำนึงว่ามีช่องว่างอยู่หน้าเครื่องหมายทับหรือไม่: <p /><div />หรือไม่และก็จะไม่ทำงานด้วยเหตุผลเดียวกัน

  • แท็กปิดตัวเองในองค์ประกอบที่เป็นโมฆะเช่น<br/>หรือ<img src="" alt=""/> จะทำงานได้ แต่เพียงเพราะเครื่องหมายสแลชต่อท้ายถูกละเว้นและในกรณีนี้ที่เกิดขึ้นกับผลลัพธ์ในพฤติกรรมที่ถูกต้อง

ผลลัพธ์คืออะไรก็ตามที่ทำงานใน "XHTML 1.0 ที่ทำหน้าที่เป็นข้อความ / html" เก่าของคุณจะทำงานต่อไปเหมือนที่เคยทำมา: การต่อท้ายสแลชบนแท็กที่ไม่เป็นโมฆะไม่ได้รับการยอมรับเช่นกัน

อีกหนึ่งหมายเหตุ: เป็นไปได้ที่จะแสดงเอกสาร HTML5 เป็น XML และบางครั้งก็ขนานนามว่า "XHTML 5.0" ในกรณีนี้กฎของ XML ที่ใช้และแท็กปิดตัวเองจะได้รับการจัดการเสมอ มันจะต้องได้รับการบริการด้วยประเภท XML mime


5

แท็กที่ปิดตัวเองนั้นใช้ได้ใน HTML5 แต่ไม่จำเป็น

<br>และ<br />ทั้งคู่ก็โอเค


12
ตามข้อมูลจำเพาะของ HTML5 />ไม่สามารถใช้ไวยากรณ์ปิดตนเอง ( ) กับองค์ประกอบ HTML ที่ไม่เป็นโมฆะ
naXa

3
คำถามที่เกี่ยวกับตัวเองปิดแท็กบนองค์ประกอบที่ไม่เป็นโมฆะเหมือนหรือ<p/> <div/>
thomasrutter

2
ในขั้นต้นคำถามไม่ได้เฉพาะเจาะจงเกี่ยวกับองค์ประกอบที่ไม่ใช่โมฆะ มันเป็นมากกว่าที่คุณสามารถใช้<... />ใน XHTML หรือคุณต้องลบ/ใน HTML5 คำถามเปลี่ยนไปหลายครั้งหลังจากนั้น
Nick

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

4

ฉันจะระมัดระวังอย่างมากกับแท็กปิดตัวเองเนื่องจากตัวอย่างนี้แสดงให้เห็น:

var a = '<span/><span/>';
var d = document.createElement('div');
d.innerHTML = a
console.log(d.innerHTML) // "<span><span></span></span>"

ความรู้สึกของฉันจะถูก<span></span><span></span>แทนที่


2
นี่อธิบายไว้ในคำตอบที่ได้รับการยอมรับ:On other [than void] HTML elements, the slash is an error, but error recovery will cause browsers to ignore it and treat the tag as a regular start tag. This will usually end up with a missing end tag causing subsequent elements to be children instead of siblings.
Palec

-1

อย่างไรก็ตาม - เพียงแค่สำหรับการบันทึก - สิ่งนี้ไม่ถูกต้อง:

<address class="vcard">
  <svg viewBox="0 0 800 400">
    <rect width="800" height="400" fill="#000">
  </svg>
</address>

และเครื่องหมายทับที่นี่จะทำให้ใช้ได้อีกครั้ง:

    <rect width="800" height="400" fill="#000"/>

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