HTML5 có thay đổi tiêu chuẩn cho nhận xét HTML không?


131

Gần đây tôi thấy rằng, có thể, có một cách nhận xét mới trong HTML5.

Thay vì <!-- -->nhận xét nhiều dòng thông thường mà tôi đã đọc, tôi nghĩ rằng tôi nhận thấy rằng IDE của tôi đã <!div >nhận xét thường xuyên . Vì vậy, tôi đã thử nghiệm nó và thật ngạc nhiên, Chrome đã nhận xét thẻ đó. Nó chỉ nhận xét ra thẻ chứ không phải nội dung của div, vì vậy tôi phải bình luận gần hơn <!/div>để tránh đóng các div khác.

Tôi đã thử nghiệm một cái khác và có vẻ như thường đặt dấu chấm than trước khi mở bất kỳ thẻ nào, biểu tượng này <, làm cho thẻ đó được nhận xét.

Đây thực sự là mới? Có phải là thực hành xấu? Nó thực sự rất thuận tiện, nhưng nó thực tế chưa (nếu không phải là mới)?

Chỉnh sửa chi tiết bổ sung: Mặc dù lỗi cú pháp hoặc giải thích sai về cú pháp cụ thể này là một lý do chính đáng, tại sao Chrome thực sự biến chúng thành nhận xét đầy đủ?

Mã được viết là :

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

Và sau đó nó được hiển thị như sau:

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

19
Nhiều khả năng nó chỉ đơn giản là một lỗi cú pháp và / hoặc thẻ vô nghĩa và do đó bị bỏ qua.
lừa dối

@deceze Tôi phần nào mong đợi rằng các trình duyệt có thể được khoan dung với cách chúng hiển thị html theo các quy tắc ít nghiêm ngặt hơn.
Andrew

1
@ Lemony-Andrew IDE làm gì vậy? Theo câu trả lời được chọn, chúng tôi có thể báo cáo sự cố này (hoặc sửa nó nếu là nguồn mở).
Dereckson

1
@Derecksonit Tôi đã kiểm tra lại IDE của mình sau khi câu trả lời chính thức được đưa ra để đảm bảo mắt tôi không lừa dối tôi. Nó đã xảy ra rằng nó không thực sự nhận xét, nhưng là màu văn bản thông thường tương tự. Đây là tất cả tình cờ.
Andrew

Câu trả lời:


196

Không có tiêu chuẩn mới cho ý kiến ​​trong HTML5. Cú pháp bình luận hợp lệ duy nhất vẫn còn <!-- -->. Từ phần 8.1.6 của W3C HTML5 :

Nhận xét phải bắt đầu bằng chuỗi bốn ký tự U + 003C LESS-THAN ĐĂNG, U + 0021 KẾT HỢP ĐỘC QUYỀN, U + 002D HYPHEN-MINUS, U + 002D HYPHEN-MINUS ( <!--).

Các <!bắt nguồn cú pháp trong SGML DTD đánh dấu, mà không phải là một phần của HTML5. Trong HTML5, nó được dành riêng cho các bình luận, các phần CDATA và khai báo DOCTYPE. Do đó, việc thay thế này có phải là thông lệ xấu hay không phụ thuộc vào việc bạn xem việc sử dụng (hoặc tệ hơn, sự phụ thuộc vào) đánh dấu lỗi thời là thực tiễn xấu.

Trình xác thực.nu gọi những gì bạn có "bình luận không có thật." - điều đó có nghĩa là nó được đối xử như một bình luận mặc dù đó không phải là một bình luận hợp lệ. Điều này có lẽ là để tương thích ngược với tiền HTML5, dựa trên SGML và đã có các khai báo đánh dấu có dạng <!FOO>, vì vậy tôi sẽ không gọi đây là mới. Lý do họ đang đối xử như bình luận là vì tờ khai SGML đánh dấu là tờ khai đặc biệt không có nghĩa là để được trả lại, nhưng vì chúng là vô nghĩa trong HTML5 (với ngoại lệ ở trên), như xa như HTML5 DOM là có liên quan họ gì khác hơn là bình luận .

Các bước sau trong mục 8.2.4 dẫn đến kết luận này, mà Chrome dường như tuân theo chữ cái:

  1. 8.2.4.1 Trạng thái dữ liệu :

    Sử dụng ký tự đầu vào tiếp theo:

    "<" (U + 003C)
    Chuyển sang trạng thái mở thẻ.

  2. 8.2.4.8 Trạng thái mở thẻ :

    Sử dụng ký tự đầu vào tiếp theo:

    "!" (U + 0021)
    Chuyển sang trạng thái mở khai báo đánh dấu.

  3. 8.2.4.45 Khai báo trạng thái mở :

    Nếu hai ký tự tiếp theo là cả hai ký tự "-" (U + 002D), hãy tiêu thụ hai ký tự đó, tạo mã thông báo nhận xét có dữ liệu là chuỗi trống và chuyển sang trạng thái bắt đầu nhận xét.

    Mặt khác, nếu bảy ký tự tiếp theo là đối sánh không phân biệt chữ hoa chữ thường của ASCII cho từ "DOCTYPE", thì hãy tiêu thụ các ký tự đó và chuyển sang trạng thái DOCTYPE.

    Mặt khác, nếu có một nút hiện tại được điều chỉnh và nó không phải là một thành phần trong không gian tên HTML và bảy ký tự tiếp theo là một kết hợp phân biệt chữ hoa chữ thường cho chuỗi "[CDATA [" (năm chữ cái viết hoa "CDATA" với chữ U + 005B ký tự TRỞ LẠI SQUARE BRACKET trước và sau), sau đó sử dụng các ký tự đó và chuyển sang trạng thái phần CDATA.

    Nếu không, đây là một lỗi phân tích cú pháp. Chuyển sang trạng thái bình luận không có thật. Ký tự tiếp theo được sử dụng, nếu có, là ký tự đầu tiên sẽ có trong nhận xét.

    Lưu ý rằng nó chỉ chuyển sang trạng thái bắt đầu nhận xét nếu chuỗi ký tự gặp phải <!--, nếu không, đó là nhận xét không có thật. Điều này phản ánh những gì được nêu trong phần 8.1.6 ở trên.

  4. 8.2.4.44 Trạng thái bình luận không có thật :

    Sử dụng mọi ký tự lên đến và bao gồm ký tự ">" (U + 003E) đầu tiên hoặc cuối tệp (EOF), tùy theo điều kiện nào đến trước. Phát ra mã thông báo nhận xét có dữ liệu là sự kết hợp của tất cả các ký tự bắt đầu và bao gồm cả ký tự khiến máy trạng thái chuyển sang trạng thái nhận xét không có thật, lên đến và bao gồm cả ký tự ngay trước ký tự được tiêu thụ cuối cùng (nghĩa là đến ký tự ngay trước ký tự U + 003E hoặc EOF), nhưng với bất kỳ ký tự U + 0000 NULL nào được thay thế bằng các ký tự SỬA CHỮA U + FFFD. (Nếu nhận xét được bắt đầu vào cuối tệp (EOF), mã thông báo trống. Tương tự, mã thông báo trống nếu được tạo bởi chuỗi " <!>".)

    Trong tiếng Anh đơn giản, điều này biến <!div displayed>thành <!--div displayed--><!/div>thành <!--/div-->, chính xác như được mô tả trong câu hỏi.

Ở một lưu ý cuối cùng, có lẽ bạn có thể mong đợi các trình phân tích cú pháp tương thích HTML5 khác hoạt động giống như Chrome.


11
Cảm ơn bạn đã dành thời gian để tìm ra lý do chính thức đằng sau vụ việc này. Nó xóa mọi thứ khá nhiều và mang lại nhiều giá trị cho giả định sai lầm của tôi.
Andrew

2
Thật kỳ lạ khi thông số HTML5 có các quy tắc để xử lý nội dung không hợp lệ. Nếu nó không hợp lệ, nó không nên được xử lý.
Arturo Torres Sánchez

2
Chà, đó là cách mà HTML và ngôn ngữ web thường sử dụng - nghiêm ngặt. Lý do cấu trúc mã không phù hợp được xử lý một cách nhẹ nhàng là cho các trang web có chất lượng tốt hơn. Càng nhiều trang web trình duyệt có thể xem và xem chính xác với cú pháp sai, người dùng cuối của họ sẽ càng hạnh phúc. Các nhà văn tiêu chuẩn web nói chung (chủ yếu là w3 chứ không phải người khác), nhận ra rằng các nhà cung cấp trình duyệt không tuân theo các nguyên tắc vì điều này. HTML5 xuất hiện và chỉ được xây dựng trên ý tưởng để thiết kế chính thức trở nên khoan dung hơn.
Andrew

3
@ ArturoTorresSánchez: XHTML đã thử phương pháp "nội dung không hợp lệ = lỗi" và thất bại thảm hại. Bên cạnh đó, các quy tắc về cơ bản nói rằng "đừng phân tích bình luận không có thật này, chỉ coi nó là bình luận và phân tích điều hợp lệ tiếp theo bạn tìm thấy". Vì vậy, tùy thuộc vào quan điểm của bạn, HTML5 sẽ không làm những gì bạn muốn bởi vì những gì bạn muốn hút hoặc HTML5 thực hiện chính xác những gì bạn muốn.
slebetman

1
@ ArturoTorresSánchez: Trong lịch sử, các máy chủ HTML sẽ mong đợi phục vụ cùng một chuỗi ký tự cho bất kỳ loại trình duyệt nào; mặc dù có thể thiết kế định dạng tài liệu theo cách mà các trình phân tích cú pháp cũ hơn có thể phân biệt các tài liệu sử dụng các tính năng mới hơn "tùy chọn" mà các trình phân tích cú pháp cũ nên bỏ qua, các tài liệu sử dụng các tính năng mới hơn quan trọng và nên bị các trình duyệt từ chối. Không hỗ trợ họ và các tài liệu hoàn toàn không hợp lệ, điều đó không được thực hiện với HTML trong những năm hình thành của nó.
supercat

12

Tôi không nghĩ rằng đây là một thói quen tốt để sử dụng vì <!là tuyên bố đánh dấu như<!DOCTYPE . Vì vậy, bạn nghĩ rằng nó đã nhận xét (tốt ... trình duyệt sẽ cố gắng giải thích nó).

Ngay cả khi nó không xuất hiện, đây dường như không phải là cú pháp chính xác để nhận xét mã HTML.


Mặc dù điều đó thể đúng, nhưng tại sao Chrome thực sự khiến những thẻ đó được nhận xét, nhưng bây giờ là loại tài liệu.
Andrew

4
Gợi ý (tôi không chắc, chỉ đoán thôi): cố gắng diễn giải> không thể> nhận xét?
Yves Lange

Điều đó dường như đủ hợp lý với tôi.
Andrew

Một lần nữa (xin lỗi để nhấn mạnh), nhưng lưu ý rằng đây chỉ là giả định!
Yves Lange
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.