HTML5 เปลี่ยนมาตรฐานสำหรับการแสดงความคิดเห็น HTML หรือไม่


131

เมื่อเร็ว ๆ นี้ฉันพบว่ามีวิธีใหม่ในการแสดงความคิดเห็นใน HTML5

แทนที่จะ<!-- -->แสดงความคิดเห็นแบบหลายบรรทัดทั่วไปที่ฉันเคยอ่านฉันคิดว่าฉันสังเกตเห็นว่า IDE ของฉัน<!div >แสดงความคิดเห็นเป็นประจำ ดังนั้นฉันจึงทดสอบและที่แปลกใจคือ Chrome ได้แสดงความคิดเห็นเกี่ยวกับแท็กนั้น มันแสดงความคิดเห็นเฉพาะแท็กไม่ใช่เนื้อหาของ div ดังนั้นฉันจึงต้องแสดงความคิดเห็นให้ใกล้ชิดมากขึ้น<!/div>เพื่อหลีกเลี่ยงการปิด div อื่น ๆ

ฉันทดสอบอีกอันหนึ่งและปรากฏว่าโดยทั่วไปแล้วการใส่เครื่องหมายอัศเจรีย์หน้าส่วนเปิดของแท็กใด ๆ สัญลักษณ์นี้<ทำให้แท็กนั้นถูกแสดงความคิดเห็น

นี่เป็นเรื่องใหม่จริงหรือ ปฏิบัติไม่ดีหรือไม่? สะดวกมากจริง ๆ แต่ยังใช้งานได้จริง (ถ้าไม่ใช่ของใหม่)

แก้ไขรายละเอียดเพิ่มเติม: แม้ว่าไวยากรณ์ผิดพลาดหรือการตีความของรูปแบบนี้โดยเฉพาะอย่างยิ่งเป็นเหตุผลที่ดีวิธีมา Chrome จริงทำให้พวกเขาเป็นความคิดเห็นเต็มรูปแบบ?

รหัสเขียนเป็น :

<!div displayed> some text here that is still displayed <!/div>

จากนั้นจะแสดงผลเป็น :

<!--div displayed--> some text here that is still displayed <!--/div-->

19
เป็นไปได้มากว่ามันเป็นเพียงข้อผิดพลาดทางไวยากรณ์และ / หรือแท็กไร้สาระดังนั้นจึงถูกเพิกเฉย
หลอกลวง

@deceze ฉันค่อนข้างคาดหวังว่าเนื่องจากเบราว์เซอร์สามารถผ่อนปรนกับวิธีที่พวกเขาแสดง html ตามกฎที่เข้มงวดน้อยกว่า
Andrew

1
@ Lemony-Andrew IDE อะไรเอ่ย? ตามคำตอบที่เลือกเราสามารถรายงานปัญหานี้ได้ (หรือแก้ไขได้หากเป็นโอเพ่นซอร์ส)
Dereckson

1
@Derecksonit ฉันตรวจสอบ IDE ของฉันอีกครั้งหลังจากที่ได้รับคำตอบอย่างเป็นทางการเพื่อให้แน่ใจว่าดวงตาของฉันไม่ได้หลอกลวงฉัน เป็นไปได้ว่ามันไม่ได้แสดงความคิดเห็นโดยพฤตินัย แต่เป็นสีข้อความปกติซึ่งคล้ายกัน ทั้งหมดนี้เป็นไปโดยบังเอิญ
Andrew

คำตอบ:


196

ไม่มีมาตรฐานใหม่สำหรับความคิดเห็นใน HTML5 ไวยากรณ์ของความคิดเห็นที่ถูกต้องเท่านั้นที่ยังคง<!-- -->อยู่ จากส่วน 8.1.6 ของ W3C HTML5 :

ความคิดเห็นต้องขึ้นต้นด้วยลำดับอักขระสี่ตัว U + 003C LESS-THAN SIGN, U + 0021 EXCLAMATION MARK, U + 002D HYPHEN-MINUS, U + 002D HYPHEN-MINUS ( <!--)

<!อินเตอร์เน็ตไวยากรณ์ใน SGML DTD มาร์กอัปซึ่งไม่ได้เป็นส่วนหนึ่งของ HTML5 ใน HTML5 สงวนไว้สำหรับความคิดเห็นส่วน CDATA และการประกาศ DOCTYPE ดังนั้นทางเลือกนี้จะเป็นแนวทางปฏิบัติที่ไม่ดีหรือไม่ขึ้นอยู่กับว่าคุณพิจารณาว่าการใช้มาร์กอัปที่ล้าสมัย (หรือแย่กว่านั้นคือการพึ่งพา) เป็นการปฏิบัติที่ไม่ดี

Validator.nu เรียกสิ่งที่คุณมีว่า "ความคิดเห็นที่ไม่ถูกต้อง" - ซึ่งหมายความว่าถือว่าเป็นความคิดเห็นแม้ว่าจะไม่ใช่ความคิดเห็นที่ถูกต้องก็ตาม สิ่งนี้น่าจะเป็นสำหรับความเข้ากันได้แบบย้อนหลังกับพรี HTML5 ซึ่งเป็นแบบ SGML และมีการประกาศมาร์กอัปที่ใช้รูปแบบ<!FOO>ดังนั้นฉันจะไม่เรียกสิ่งนี้ใหม่ เหตุผลที่พวกเขากำลังได้รับการรักษาเช่นการแสดงความคิดเห็นเป็นเพราะ SGML มาร์กอัปประกาศได้ประกาศพิเศษไม่ได้หมายถึงจะแสดงผล แต่เนื่องจากพวกเขามีความหมายใน HTML5 (มีข้อยกเว้นดังกล่าวข้างต้น) เท่าที่ HTML5 DOM เป็นห่วงพวกเขามีอะไรมากไปกว่าการแสดงความคิดเห็น .

ขั้นตอนต่อไปนี้ในหัวข้อ 8.2.4นำไปสู่ข้อสรุปนี้ซึ่งดูเหมือนว่า Chrome จะปฏิบัติตามตัวอักษร:

  1. 8.2.4.1 สถานะข้อมูล :

    ใช้อักขระอินพุตถัดไป:

    "<" (U + 003C)
    เปลี่ยนเป็นสถานะเปิดแท็ก

  2. 8.2.4.8 สถานะเปิดแท็ก :

    ใช้อักขระอินพุตถัดไป:

    "!" (U + 0021)
    เปลี่ยนเป็นสถานะเปิดการประกาศมาร์กอัป

  3. 8.2.4.45 สถานะเปิดการประกาศมาร์กอัป :

    หากอักขระสองตัวถัดไปเป็นทั้งอักขระ "-" (U + 002D) ให้ใช้อักขระสองตัวนั้นสร้างโทเค็นข้อคิดเห็นที่มีข้อมูลเป็นสตริงว่างและเปลี่ยนเป็นสถานะเริ่มต้นความคิดเห็น

    มิฉะนั้นหากอักขระเจ็ดตัวถัดไปเป็นการจับคู่ ASCII ที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่สำหรับคำว่า "DOCTYPE" ให้ใช้อักขระเหล่านั้นและเปลี่ยนเป็นสถานะ DOCTYPE

    มิฉะนั้นหากมีโหนดปัจจุบันที่ปรับแล้วและไม่ใช่องค์ประกอบในเนมสเปซ HTML และอักขระเจ็ดตัวถัดไปจะเป็นการจับคู่แบบตรงตามตัวพิมพ์เล็กและใหญ่สำหรับสตริง "[CDATA [" (ตัวพิมพ์ใหญ่ห้าตัว "CDATA" ที่มี U + 005B LEFT SQUARE BRACKET อักขระก่อนและหลัง) จากนั้นใช้อักขระเหล่านั้นและเปลี่ยนเป็นสถานะส่วน CDATA

    มิฉะนั้นนี่เป็นข้อผิดพลาดในการแยกวิเคราะห์ เปลี่ยนเป็นสถานะความคิดเห็นปลอม อักขระถัดไปที่ใช้ถ้ามีคืออักขระตัวแรกที่จะอยู่ในความคิดเห็น

    สังเกตว่ามันบอกว่าให้เปลี่ยนเป็นสถานะเริ่มต้นความคิดเห็นก็ต่อเมื่อลำดับของอักขระที่พบไม่<!--เช่นนั้นจะเป็นความคิดเห็นที่ไม่ถูกต้อง สิ่งนี้สะท้อนถึงสิ่งที่ระบุไว้ในหัวข้อ 8.1.6 ข้างต้น

  4. 8.2.4.44 สถานะความคิดเห็นที่เป็นเท็จ :

    ใช้อักขระทุกตัวจนถึงอักขระ ">" (U + 003E) ตัวแรกหรือท้ายไฟล์ (EOF) แล้วแต่ว่าอะไรจะเกิดขึ้นก่อน ส่งโทเค็นข้อคิดเห็นที่มีข้อมูลเป็นการต่อกันของอักขระทั้งหมดที่เริ่มต้นจากและรวมถึงอักขระที่ทำให้เครื่องสถานะเปลี่ยนเป็นสถานะข้อคิดเห็นปลอมขึ้นและรวมอักขระทันทีก่อนอักขระที่ใช้ครั้งสุดท้าย (เช่นถึงอักขระ ก่อนอักขระ U + 003E หรือ EOF) แต่มีอักขระ U + 0000 NULL ใด ๆ แทนที่ด้วยอักขระ U + FFFD REPLACEMENT CHARACTER (หากความคิดเห็นเริ่มต้นโดยตอนท้ายของไฟล์ (EOF) โทเค็นจะว่างเปล่าในทำนองเดียวกันโทเค็นจะว่างเปล่าหากสร้างโดยสตริง " <!>")

    ในภาษาอังกฤษธรรมดาสิ่งนี้จะเปลี่ยน<!div displayed>เป็น<!--div displayed-->และ<!/div>เป็น<!--/div-->ตามที่อธิบายไว้ในคำถามทุกประการ

ในหมายเหตุสุดท้ายคุณอาจคาดหวังว่าโปรแกรมแยกวิเคราะห์ที่เข้ากันได้กับ HTML5 อื่น ๆ จะทำงานเช่นเดียวกับ Chrome


11
ขอขอบคุณที่สละเวลาค้นหาเหตุผลอย่างเป็นทางการที่อยู่เบื้องหลังเหตุการณ์นี้ มันเคลียร์สิ่งต่างๆได้ไม่น้อยและให้ความถูกต้องมากกับข้อสันนิษฐานที่ไม่ถูกต้องของฉัน
Andrew

2
เป็นเรื่องแปลกที่ข้อมูลจำเพาะของ HTML5 มีกฎในการประมวลผลเนื้อหาที่ "ไม่ถูกต้อง" หากไม่ถูกต้องก็ไม่ควรดำเนินการเลย
Arturo Torres Sánchez

2
นั่นคือสิ่งที่ HTML และภาษาเว็บเคยเป็น - เข้มงวด เหตุผลที่มีการประมวลผลโครงสร้างโค้ดที่ไม่เหมาะสมเพื่อให้เว็บไซต์มีคุณภาพดีขึ้น ยิ่งมีเว็บไซต์ที่เบราว์เซอร์สามารถดูได้มากขึ้นและดูได้อย่างถูกต้องโดยใช้ไวยากรณ์ที่ไม่ถูกต้องผู้ใช้ปลายทางก็จะมีความสุข ผู้เขียนมาตรฐานเว็บทั่วไป (ส่วนใหญ่เป็น w3 ไม่ใช่คนอื่น ๆ ) ตระหนักว่าผู้จำหน่ายเบราว์เซอร์ไม่ปฏิบัติตามหลักเกณฑ์ด้วยเหตุนี้ HTML5 มาและสร้างขึ้นจากแนวคิดที่จะทำให้การออกแบบผ่อนปรนมากขึ้นอย่างเป็นทางการเท่านั้น
Andrew

3
@ ArturoTorresSánchez: XHTML พยายามใช้วิธี "เนื้อหาไม่ถูกต้อง = ข้อผิดพลาด" และล้มเหลวอย่างน่าอนาถ นอกจากนี้กฎโดยทั่วไประบุว่า "อย่าแยกวิเคราะห์ความคิดเห็นที่เป็นเท็จนี้เพียงแค่ถือว่าเป็นความคิดเห็นและแยกวิเคราะห์สิ่งที่ถูกต้องต่อไปที่คุณพบ" ดังนั้นขึ้นอยู่กับมุมมองของคุณ HTML5 อาจไม่ทำในสิ่งที่คุณต้องการเพราะสิ่งที่คุณต้องการนั้นแย่หรือ HTML5 ทำในสิ่งที่คุณต้องการ
slebetman

1
@ ArturoTorresSánchez: ในอดีตเซิร์ฟเวอร์ HTML คาดว่าจะให้บริการอักขระลำดับเดียวกันกับเบราว์เซอร์ทุกประเภท แม้ว่าจะมีความเป็นไปได้ในการออกแบบรูปแบบเอกสารในลักษณะที่ตัวแยกวิเคราะห์รุ่นเก่าจะสามารถแยกแยะเอกสารที่ใช้คุณลักษณะใหม่ "ที่เป็นทางเลือก" ซึ่งตัวแยกวิเคราะห์รุ่นเก่าควรละเว้นเอกสารที่ใช้คุณลักษณะใหม่ที่สำคัญและควรถูกปฏิเสธโดยเบราว์เซอร์ที่ไม่ใช้ ไม่สนับสนุนพวกเขาและเอกสารที่เป็นเพียงธรรมดาไม่ถูกต้องสิ่งดังกล่าวไม่ได้ทำด้วย HTML ในช่วงปีที่ผ่านมา
supercat

12

ฉันไม่คิดว่านี่เป็นนิสัยที่ดีที่จะใช้เนื่องจาก<!หมายถึงการประกาศมาร์กอัปเช่น<!DOCTYPE. ดังนั้นคุณคิดว่ามันแสดงความคิดเห็น (ดี ... เบราว์เซอร์จะพยายามตีความ)

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


แม้ว่านั่นอาจเป็นความจริง Chrome ทำให้แท็กเหล่านั้นแสดงความคิดเห็นได้อย่างไร แต่ตอนนี้ประเภทหลัก
แอนดรูว์

4
ข้อเสนอแนะ (ฉันไม่แน่ใจเพียงแค่คาดเดา): พยายามตีความ> ไม่สามารถ> แสดงความคิดเห็น?
Yves Lange

นั่นดูสมเหตุสมผลสำหรับฉัน
Andrew

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