Các thẻ tự đóng (không trống) có hợp lệ trong HTML5 không?


668

Các W3C validator không giống như thẻ tự đóng (những người kết thúc bằng " />") trên phi khoảng trống yếu tố. (Các phần tử trống là những phần tử có thể không bao giờ chứa bất kỳ nội dung nào.) Chúng có còn hợp lệ trong HTML5 không?

Một số ví dụ về các phần tử void được chấp nhận :

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

Một số ví dụ về các yếu tố không trống bị từ chối :

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

Lưu ý: trình xác nhận W3C thực sự chấp nhận các thẻ tự đóng trống: tác giả ban đầu gặp sự cố do lỗi đánh máy đơn giản (\>thay vì/>); tuy nhiên, các thẻ tự đóng không có giá trị 100% trong HTML5 nói chung và các câu trả lời chi tiết về vấn đề các thẻ tự đóng trên các hương vị HTML khác nhau.


2
@Ben: oh, xin lỗi, tôi nghĩ bạn đúng. Trong trường hợp này, tôi đã hiểu nhầm câu hỏi ban đầu, tôi nghĩ OP muốn biết liệu các thẻ tự đóng có hợp lệ trong HTML5 hay không. Nhưng điều này có nghĩa là anh ta chỉ mắc lỗi chính tả trong mã của mình hoặc anh ta không biết cách viết các thẻ tự đóng một cách thích hợp, điều đó có nghĩa là trình xác nhận W3C đã đánh dấu mã của anh ta là không hợp lệ.
Sk8erPeter

16
Để tiết kiệm thời gian cho những người đọc trong tương lai: có, cú pháp trong câu hỏi không chính xác và không, bạn không nên thay đổi nó. OP đã giải thích rõ ràng và chính đáng tại sao . Vì nó đã dẫn đến các lỗi xác nhận đã đặt ra câu hỏi này, cú pháp không nên được sửa.
Jordan Gray

2
Có phải mọi người vẫn đang chiến đấu về hướng mà những nhát chém phải đối mặt? Nào.
BoltClock

3
@BoltClock Yup, vẫn chiến đấu. Các bạn: nếu câu hỏi này được hỏi về \>, thì nó nên được đóng lại như một câu hỏi sửa lỗi vô dụng. Các câu trả lời tất cả địa chỉ />. Các />phiên bản là người duy nhất hữu ích. Để cho nó được.
Gilles 'SO- ngừng trở nên xấu xa'

1
Sau đó, câu hỏi phải được đặt lại, bởi vì trình xác nhận W3C thực sự chấp nhận các thẻ tự đóng. Thật khó để sắp xếp lại câu hỏi theo cách như vậy mà không ảnh hưởng đến tính toàn vẹn của nó đối với mục đích ban đầu. Do đó, nếu chúng ta muốn tuân thủ các quy tắc của SO, chúng ta có thể phải hy sinh sự rõ ràng trong các câu hỏi như câu hỏi này, mặc dù có vẻ như chỉnh sửa câu hỏi là điều hợp lý duy nhất để làm, vì lợi ích lớn hơn Trung bình cộng. Chúng ta có thể bắt đầu một cuộc thảo luận khác về meta, nếu có nhiều câu hỏi khác là một vấn đề tương tự.
osa

Câu trả lời:


1238
  • Trong HTML 4 , <foo /(có, hoàn toàn không có >) nghĩa là <foo>(dẫn đến <br />ý nghĩa <br>>(nghĩa là <br>&gt;) và <title/hello/ý nghĩa <title>hello</title>). Đây là một quy tắc SGML mà các trình duyệt đã làm rất kém trong việc hỗ trợ và thông số kỹ thuật khuyên các tác giả nên tránh cú pháp .

  • Trong XHTML , <foo />có nghĩa là<foo></foo> . Đây là quy tắc XML áp dụng cho tất cả các tài liệu XML. Điều đó nói rằng, XHTML thường được phục vụ theo text/htmlđó (ít nhất là trong lịch sử) được xử lý bởi các trình duyệt sử dụng trình phân tích cú pháp khác với các tài liệu được phục vụ như application/xhtml+xml. W3C cung cấp các nguyên tắc tương thích để tuân theo XHTML như text/html. (Về cơ bản: Chỉ sử dụng cú pháp thẻ tự đóng khi phần tử được xác định là EMPTY (và thẻ kết thúc bị cấm trong thông số HTML)).

  • Trong HTML5 , ý nghĩa của việc <foo /> phụ thuộc vào loại phần tử .

    • Trên các phần tử HTML được chỉ định là phần tử void (về cơ bản là "Một phần tử tồn tại trước HTML5 và bị cấm có bất kỳ nội dung nào"), các thẻ kết thúc chỉ bị cấm. Dấu gạch chéo ở cuối thẻ bắt đầu được cho phép, nhưng không có ý nghĩa. Nó chỉ là đường cú pháp cho những người (và các công cụ tô sáng cú pháp) nghiện XML.
    • Trên các phần tử HTML khác, dấu gạch chéo là một lỗi, nhưng việc khôi phục lỗi sẽ khiến các trình duyệt bỏ qua nó và coi thẻ là thẻ bắt đầu thông thường. Điều này thường sẽ kết thúc với một thẻ kết thúc bị thiếu khiến các yếu tố tiếp theo là trẻ em thay vì anh chị em.
    • Các phần tử nước ngoài (được nhập từ các ứng dụng XML như SVG) coi nó như cú pháp tự đóng.

24
" ... những người nghiện XML. ". Bạn dường như đề xuất rằng tuân thủ XML là xấu. Tuy nhiên, kết quả cuối cùng trong HTML5 dường như là dù sao chúng ta vẫn phải xử lý các dấu ngoặc nhọn (nghĩa là có phần lớn sự bất tiện của XML), trong khi điều đó khiến việc sử dụng các công cụ dựa trên XML trở nên khó khăn hơn (ví dụ: các công cụ khuôn mẫu hoặc các bộ xử lý khác nhau ). Ngay cả từ quan điểm thế hệ, có vẻ như điều đó <object data="..." /><img src="..."></src>không ổn, trong khi <object data="..."></object><img src="..." />là, điều đó làm cho việc thống nhất công cụ trở nên khó khăn hơn. Điều này trông giống như một tình huống thua-thua.
Bruno

7
@Bruno - HTML có trước XML. Những nỗ lực để khiến mọi người chuyển sang XHTML đã thất bại. Với text/html, các trình duyệt không cung cấp bất kỳ ý nghĩa đặc biệt nào cho dấu gạch chéo, vì vậy bao gồm nó không phục vụ mục đích thực tế. Nó chỉ ở đó để làm cho nó trông giống XML hơn đối với những người không thể bỏ thói quen này.
Quentin

6
@Quentin Tôi không hoàn toàn không đồng ý. Tôi chỉ thấy hơi xấu hổ khi một tương đương XML hợp lệ không nhất thiết phải là HTML5 hợp lệ (ví dụ <img ...></img>thay vì <img ...>hoặc <img ... />). Vì HTML5 nói chung ít nghiêm ngặt hơn (có thể là lý do tại sao XHTML thất bại), nên rất có thể đã chấp nhận một cái gì đó như thế <img ...></img>. Thật không may, điều đó không xảy ra, do đó, một trình tạo mẫu dựa trên XML cần biết cách phân biệt việc sản xuất các phần tử void hoặc các phần tử tự đóng: bạn thậm chí không thể có một quy tắc để viết tất cả các phần tử trống như <tag></tag>.
Bruno

3
XHTML đã thất bại trước khi HTML 5 thậm chí còn xuất hiện và bạn không thể có các phần tử trống dài vì việc sửa lỗi trình duyệt mà XHTML có trước sẽ làm những việc như xử lý </br>như <br>vậy <br></br>sẽ là ngắt dòng kép. (và khả năng tương thích ngược với đánh dấu xấu trong thế giới thực (như </br>) là một trong những mục tiêu thiết kế của HTML 5).
Quentin

1
TỪ W3C: Các phần tử trống: area, base, br, col, embed, hr, img, input, keygen, link, meta, param, source, track, wbr "Các phần tử trống chỉ có thẻ bắt đầu; không được chỉ định thẻ kết thúc cho các phần tử trống. " w3.org/TR/html5/syntax.html#void-elements
Fabio Nolasco

406

Như Nikita Skvortsov đã chỉ ra, một div tự đóng sẽ không xác nhận. Điều này là do div là một phần tử bình thường , không phải là phần tử void .

Theo thông số HTML5 , các thẻ không thể có bất kỳ nội dung nào (được gọi là phần tử void ) có thể tự đóng *. Điều này bao gồm các thẻ sau:

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

Tuy nhiên, "/" là hoàn toàn tùy chọn trên các thẻ ở trên, do đó, <img/>không khác biệt <img>, nhưng <img></img>không hợp lệ.

* Lưu ý: các yếu tố nước ngoài cũng có thể tự đóng, nhưng tôi không nghĩ đó là phạm vi cho câu trả lời này.


1
Công cụ dành cho nhà phát triển của IE10 đang mang đến cho tôi "HTML1500: Thẻ không thể tự đóng. Sử dụng thẻ đóng rõ ràng." trên dòng <meta charset = "UTF-8" /> Bạn có biết tại sao lại như vậy không?
James ở Indy

Ok, tôi phát hiện ra rằng các thẻ tự đóng không nên có dấu gạch chéo (và loại bỏ nó sẽ sửa lỗi của tôi). Trích dẫn: t Tiffanybbrown.com/2011/03/23/ Lời
James ở Indy

Thông số kỹ thuật đã thay đổi. Bây giờ, các phần tử "void" hoặc "tự đóng" không nên bao gồm dấu gạch chéo, khi được phục vụ dưới dạng văn bản HTML 5. Tuy nhiên, nếu nó đang được phục vụ dưới dạng XHTML, dấu gạch chéo có thể được yêu cầu (kiểm tra tài liệu trong trường hợp này). Trong sử dụng thực tế, các trang thường sẽ hiển thị như mong đợi ngay cả khi /đã bao gồm đóng, nhưng điều này không được đảm bảo (nó phụ thuộc vào trình duyệt viết lại mã cho bạn một cách hiệu quả và diễn giải nó như bạn dự định.) Ngoài ra, nếu vì một số lý do, trang của bạn được yêu cầu để vượt qua xác thực HTML 5, nó có thể không vượt qua nếu bạn đóng thẻ cho các thành phần void.
SherylHohman

Về nhận xét của @ SherylHohman, tôi không tin thông số kỹ thuật đã thay đổi (hoặc nếu có, nó đã thay đổi trở lại). Xem các phần tử w3.org/TR/html5/syntax.html#start-tags (8.1.2.1.6) - void (hoặc nước ngoài) vẫn có thể bao gồm dấu gạch chéo.
ChrisC

63

Trong thực tế, sử dụng các thẻ tự đóng trong HTML sẽ hoạt động như bạn mong đợi. Nhưng nếu bạn lo lắng về việc viết HTML5 hợp lệ , bạn nên hiểu cách sử dụng các thẻ như vậy hoạt động trong hai dạng cú pháp khác nhau mà bạn có thể sử dụng. HTML5 định nghĩa cả cú pháp HTML và cú pháp XHTML, tương tự nhưng không giống nhau. Cái nào được sử dụng phụ thuộc vào loại phương tiện được gửi bởi máy chủ web.

Nhiều khả năng, các trang của bạn đang được phục vụ theo text/html, theo cú pháp HTML nhẹ nhàng hơn. Trong những trường hợp này, HTML5 cho phép các thẻ bắt đầu nhất định có tùy chọn / trước khi kết thúc>. Trong những trường hợp này, / là tùy chọn và bị bỏ qua, do đó <hr><hr />giống hệt nhau. Đặc tả HTML gọi các "phần tử void" này và đưa ra một danh sách các phần tử hợp lệ. Nói đúng ra, tùy chọn / chỉ hợp lệ trong các thẻ bắt đầu của các phần tử void này; ví dụ, <br /><hr />là HTML5 hợp lệ, nhưng <p />không phải.

Thông số HTML5 phân biệt rõ ràng giữa những gì là chính xác cho các tác giả HTML và cho các nhà phát triển trình duyệt web, với nhóm thứ hai được yêu cầu chấp nhận tất cả các loại cú pháp "di sản" không hợp lệ. Trong trường hợp này, điều đó có nghĩa là các trình duyệt tuân thủ HTML5 sẽ chấp nhận các thẻ tự đóng bất hợp pháp, như <p />và hiển thị chúng như bạn có thể mong đợi. Nhưng đối với một tác giả, trang đó sẽ không phải là HTML5 hợp lệ. (Quan trọng hơn, cây DOM bạn nhận được từ việc sử dụng loại cú pháp bất hợp pháp này có thể bị làm hỏng nghiêm trọng; <span />ví dụ, các thẻ tự đóng có xu hướng làm rối tung mọi thứ lên rất nhiều ).

(Trong trường hợp bất thường là máy chủ của bạn biết cách gửi các tệp XHTML dưới dạng loại MIME XML, trang cần phải tuân theo cú pháp XHTML DTD và XML. Điều đó có nghĩa là các thẻ tự đóng được yêu cầu cho các yếu tố được xác định như vậy.)


31
<p /> sẽ được coi là thẻ mở, không phải là thẻ tự đóng. Điều đó có nghĩa là toàn bộ phần còn lại của tài liệu sẽ được coi là nằm trong phần tử P. Đó không phải là điều tôi "có thể mong đợi", và sẽ tạo ra một mớ hỗn độn nghiêm trọng trên bất kỳ trang không tầm thường nào.
mhsmith

12

HTML5 về cơ bản hoạt động như thể dấu gạch chéo không có ở đó. Không có thứ gọi là thẻ tự đóng trong cú pháp HTML5.

  • Các thẻ tự đóng trên các phần tử không trống như <p/>, <div/>sẽ không hoạt động. Dấu gạch chéo sẽ bị bỏ qua và chúng sẽ được coi là thẻ mở. Điều này có khả năng dẫn đến các vấn đề làm tổ.

    Điều này đúng bất kể có khoảng trắng phía trước dấu gạch chéo <p />hay không và <div />cũng không hoạt động vì lý do tương tự.

  • Các thẻ tự đóng trên các phần tử void như <br/>hoặc <img src="" alt=""/> sẽ hoạt động, nhưng chỉ vì dấu gạch chéo bị bỏ qua và trong trường hợp này xảy ra dẫn đến hành vi đúng.

Kết quả là, mọi thứ hoạt động trong "XHTML 1.0 cũ của bạn được dùng làm văn bản / html" sẽ tiếp tục hoạt động như trước: dấu gạch chéo trên các thẻ không trống không được chấp nhận ở đó trong khi dấu gạch chéo trên các phần tử void hoạt động.

Thêm một lưu ý: có thể biểu diễn một tài liệu HTML5 dưới dạng XML và đôi khi điều này được gọi là "XHTML 5.0". Trong trường hợp này, các quy tắc áp dụng XML và các thẻ tự đóng sẽ luôn được xử lý. Nó sẽ luôn cần được phục vụ với một loại mime XML.


4

Thẻ tự đóng có giá trị trong HTML5, nhưng không bắt buộc.

<br><br />đều ổn cả


12
Theo thông số HTML5, cú pháp tự đóng ( />) không thể được sử dụng trên phần tử HTML không trống.
naXa

2
Câu hỏi là về các thẻ tự đóng trên các phần tử không trống , như <p/>hoặc <div/>.
thomasrutter

2
Ban đầu câu hỏi không cụ thể về các yếu tố không trống. Nó giống như, bạn vẫn có thể sử dụng <... />như trong XHTML hay bạn phải xóa /trong HTML5. Câu hỏi đã được thay đổi nhiều lần sau đó.
Nick

Dù bằng cách nào, câu trả lời là dấu gạch chéo sẽ bị bỏ qua, nó sẽ phá vỡ các phần tử không được khai báo là void, nhưng sẽ tương thích với các phần tử void.
thomasrutter

4

Tôi sẽ rất cẩn thận với các thẻ tự đóng vì ví dụ này thể hiện:

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

<span></span><span></span>Thay vào đó, cảm giác ruột của tôi sẽ thay thế


2
Điều này được mô tả trong câu trả lời được chấp nhận: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

Tuy nhiên -chỉ cho hồ sơ - điều này không hợp lệ:

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

Và một dấu gạch chéo ở đây sẽ làm cho nó hợp lệ trở lại:

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

1
Đó là bởi vì svg được viết bằng xml, không phải html. Nó sử dụng các quy tắc phân tích cú pháp khác nhau
Cà phê điện
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.