Tất cả các yếu tố tự đóng hợp lệ trong XHTML (được các trình duyệt chính triển khai) là gì?


188

Tất cả các yếu tố tự đóng hợp lệ (ví dụ: <br/>) trong XHTML (như được thực hiện bởi các trình duyệt chính) là gì?

Tôi biết rằng về mặt kỹ thuật XHTML cho phép mọi phần tử tự đóng, nhưng tôi đang tìm một danh sách các phần tử được hỗ trợ bởi tất cả các trình duyệt chính. Xem http://dusan.fora.si/blog/elf-closes-tags để biết ví dụ về một số vấn đề gây ra bởi các yếu tố tự đóng như <div />.


7
Đây không phải là một trong những mục đích của XHTML sao? Tôi nghĩ một trong những lợi thế của XHTML là bạn có thể sử dụng trình tạo XML để tạo HTML. Tại sao bất kỳ trình tạo XML nào cũng nhận thức được các thẻ nào được phép tự đóng? Quá kỳ lạ.
Elijah

6
Lý do mà câu trả lời "khập khiễng", "không chính xác" được chấp nhận là vì nó đã trả lời câu hỏi mà kamens rõ ràng đang hỏi. Anh ta muốn biết những phần tử nào có thể tự đóng khi phục vụ XHTML dưới dạng văn bản / html mà không gây ra sự cố kết xuất trong trình duyệt. Rất nhiều trang được viết bằng XHTML và được phân phát dưới dạng văn bản / html mặc dù về mặt kỹ thuật không chính xác. Câu hỏi có thể được cải thiện với sự làm rõ này, nhưng việc trả lời một câu hỏi khác (điều gì xảy ra khi bạn đóng vai trò là ứng dụng / xml hoặc liệu các thẻ số ít trong văn bản / html có nên đóng /) không hữu ích trong trường hợp này.
Nick Lockwood

Câu trả lời:


180

Mọi trình duyệt hỗ trợ XHTML (Firefox, Opera, Safari, IE9 ) đều hỗ trợ cú pháp tự đóng trên mọi thành phần .

<div/>, <script/>, <br></br>Tất cả nên chỉ làm việc tốt. Nếu họ không, thì bạn có HTML với XHTML DOCTYPE được thêm không thích hợp.

DOCTYPE không thay đổi cách tài liệu được diễn giải. Chỉ loại MIME nào .

Quyết định của W3C về việc bỏ qua DOCTYPE :

WG HTML đã thảo luận về vấn đề này: ý định là cho phép các trình duyệt cũ (chỉ HTML) chấp nhận các tài liệu XHTML 1.0 bằng cách làm theo các hướng dẫn và phục vụ chúng dưới dạng văn bản / html. Do đó, các tài liệu được phân phát dưới dạng văn bản / html phải được coi là HTML và không phải là XHTML.

Đó là một cạm bẫy rất phổ biến, bởi vì Trình xác thực W3C phần lớn bỏ qua quy tắc đó, nhưng các trình duyệt tuân theo nó một cách tôn giáo. Đọc Hiểu HTML, XML và XHTML từ blog WebKit:

Trên thực tế, phần lớn các tài liệu được cho là XHTML trên internet được phục vụ như text/html. Điều đó có nghĩa là chúng hoàn toàn không phải là XHTML, nhưng HTML thực sự không hợp lệ do xử lý lỗi của trình phân tích cú pháp HTML. Tất cả những người hợp lệ XHTML 1.0! các liên kết trên web đang thực sự nói rằng HTML không hợp lệ 4.01!.


Để kiểm tra xem bạn có XHTML thực hay HTML không hợp lệ với DOCTYPE của XHTML, hãy đặt cái này vào tài liệu của bạn:

<span style="color:green"><span style="color:red"/> 
 If it's red, it's HTML. Green is XHTML.
</span>

Nó xác nhận và trong XHTML thực, nó hoạt động hoàn hảo (xem: 1 so với 2 ). Nếu bạn không thể tin vào mắt mình (hoặc không biết cách đặt loại MIME), hãy mở trang của bạn qua proxy XHTML .

Một cách khác để kiểm tra là xem nguồn trong Firefox. Nó sẽ làm nổi bật dấu gạch chéo màu đỏ khi chúng không hợp lệ.

Trong HTML5 / XHTML5, điều này đã không thay đổi và sự khác biệt thậm chí còn rõ ràng hơn, bởi vì bạn thậm chí không có thêm DOCTYPE. Content-Typelà vua


Đối với bản ghi, thông số XHTML cho phép mọi phần tử tự đóng bằng cách tạo XHTML thành ứng dụng XML : [nhấn mạnh của tôi]

Thẻ phần tử rỗng có thể được sử dụng cho bất kỳ phần tử nào không có nội dung , cho dù nó có được khai báo hay không bằng cách sử dụng từ khóa EMPTY.

Nó cũng được hiển thị rõ ràng trong thông số XHTML :

Phần tử rỗng phải hoặc là có một thẻ kết thúc hoặc bắt đầu từ khóa phải kết thúc với />. Chẳng hạn, <br/>hoặc<hr></hr>


7
Không đúng afaik, bởi vì sử dụng các phiên bản tự đóng <script>hoặc <div>kết quả trong kết xuất / giải thích khác nhau.
ZeissS

13
@ZeissS chỉ trong text/html. Trong XHTML thực, được gửi vì application/xhtml+xmlnó hoạt động tốt. Vui lòng đọc bài viết tôi đã liên kết với (hoặc XHTML spec Phụ lục C) trước khi bỏ phiếu.
Kornel

3
@yhel bạn có thể bảo đảm rằng các thẻ <script /> tự đóng sẽ hoạt động trong các trình duyệt cũ hơn không? Tôi không nghĩ vậy. Bạn có vẻ có thẩm quyền và hầu hết thông tin của bạn là chính xác, nhưng kinh nghiệm cho tôi biết rằng các thẻ script tự đóng sẽ có vấn đề và tốt nhất là chỉ nên tránh chúng hoàn toàn thay vì tự làm mình đau đầu.
Siêu hình học

6
@Metagograph nếu các trình duyệt cũ hơn không hỗ trợ XHTML thực, HOẶC bạn không đặt loại MIME , thì nó sẽ không hoạt động. Tuy nhiên, trong các trình duyệt hỗ trợ XHTML (tất cả các trình duyệt chính tại thời điểm này) với application/xhtml+xmlloại MIME tôi có thể đảm bảo <script/>sẽ hoạt động. Với loại MIME. Chỉ có.
Kornel

4
@capdragon: Các trình duyệt cũ hơn không hỗ trợ XHTML (được dùng dưới dạng 'application / xhtml + xml'). Nếu bạn gửi cho họ một tài liệu XHTML dưới dạng 'text / html', thì XHTML sẽ được hiển thị dưới dạng súp thẻ (tức là trình duyệt phân tích nó dưới dạng HTML và xem xét các lỗi thẻ tự đóng, mà nó phục hồi một cách duyên dáng). Các tùy chọn của bạn là 1. viết HTML 4 (không chính xác là một tùy chọn nếu sử dụng ASP.NET kết xuất XHTML), 2. phục vụ XHTML của bạn dưới dạng 'application / xhtml + xml' (yêu cầu IE9 + và loại MIME này sẽ phá vỡ các tập lệnh trong tất cả các trình duyệt Dù sao đi nữa, vì vậy def không phải là một tùy chọn), 3. viết HTML 5, về cơ bản làm cho súp tag trở thành tiêu chuẩn :)
Triynko

41

Một yếu tố rất cẩn thận với chủ đề này là <scriptyếu tố>. Nếu bạn có một tệp nguồn bên ngoài, nó SILL gây ra vấn đề khi bạn tự đóng nó. Thử nó:

<!-- this will not consistently work in all browsers! -->
<script type="text/javascript" src="external.js" />

Điều này sẽ hoạt động trong Firefox, nhưng ít nhất là phá vỡ IE6. Tôi biết, bởi vì tôi đã gặp phải điều này khi quá nhiệt tình tự đóng mọi yếu tố tôi thấy ;-)


Ảnh hưởng đến tất cả các phiên bản của MSIE: webbugtrack.blogspot.com/2007/08/ từ
scunliffe

4
<script> không tự đóng trong Firefox 3.
hsivonen

Chà, nó đã từng hoạt động trong Firefox khi tôi gặp nó. Có vẻ như nó không hoạt động trong bất kỳ trình duyệt nào nữa. Cũng có thể chỉ làm việc trong chế độ quirks?
Erik van Brakel

1
@erickson nó hoạt động tốt trong Firefox nếu bạn có loại MIME đúng.
Kornel

WebKit tiếp tục làm điều đó vì lý do tương thích.
Yuhong Bao

35

Cú pháp tự đóng hoạt động trên tất cả các thành phần trong application / xhtml + xml. Nó không được hỗ trợ trên bất kỳ phần tử nào trong văn bản / html, nhưng các phần tử là trống rỗng, trong HTML4 hoặc không có giá trị trong HTML5 không có thẻ kết thúc, vì vậy nếu bạn đặt dấu gạch chéo vào những phần tử đó thì nó sẽ xuất hiện cú pháp tự đóng đã được hỗ trợ.


33

Từ trang tham khảo của Trường W3 :

<area />
<base />
<basefont />
<br />
<hr />
<input />
<img />
<link />
<meta />

7
w3schools.com/tags/default.asp Tôi thấy 12 thẻ kết thúc bằng />:"area", "base", "basefont", "br", "col", "frame", "hr", "img", "input", "link", "meta", "param"
mpen

94
Xin lưu ý rằng W3schools không liên kết với W3C và thậm chí không phản hồi các chỉnh sửa được gửi bởi các thành viên W3C.
Kornel

2
Như thường lệ, w3schools gần như đúng. Một cách chính xác để tìm các phần tử trống là chạy grep EMPTY xhtml1-strict.dtd | sorthoặcgrep EMPTY xhtml1-transitional.dtd | sort
cayhorstmann

1
IMHO, mọi người bash W3Schools quá khó. Bản thân nó đã chứng tỏ là một nguồn tài nguyên tuyệt vời khi bạn BẮT ĐẦU (!) Về một chủ đề mà bạn không biết gì về nó.
Priidu Neemre 2/10/2015

28

Câu hỏi hay hơn là: những thẻ nào có thể tự đóng ngay cả trong chế độ HTML mà không ảnh hưởng đến mã? Trả lời: chỉ những nội dung có nội dung trống (không có giá trị). Theo thông số kỹ thuật HTML , các yếu tố sau là void:

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

Phiên bản cũ hơn của đặc điểm kỹ thuật cũng được liệt kê command. Ngoài ra, theo nhiều nguồn khác nhau, các thẻ lỗi thời hoặc không chuẩn sau đây sẽ bị hủy:

basefont, bgsound, frame, isindex


10

Hy vọng điều này sẽ giúp ai đó:

<base />
<basefont />
<frame />
<link />
<meta />

<area />
<br />
<col />
<hr />
<img />
<input />
<param />

5

Còn về <meta><link>? Tại sao họ không có trong danh sách đó?

Nguyên tắc nhanh, không tự đóng bất kỳ yếu tố nào có ý định có nội dung, bởi vì nó chắc chắn sẽ gây ra sự cố trình duyệt sớm hay muộn.

Những cái mà tự nhiên tự đóng, thích <br><img>, nên rõ ràng. Những người không ... chỉ không tự đóng chúng!


4

Lần cuối cùng tôi kiểm tra, sau đây là các phần tử trống / void được liệt kê trong HTML5.

Hợp lệ cho các tác giả: area, base, br, col, lệnh, embed, eventource, hr, img, input, link, meta, param, source

Không hợp lệ cho các tác giả: basefont, bssound, frame, spacer, wbr

Bên cạnh một số ít tính năng mới trong HTML5, điều đó sẽ cho bạn ý tưởng về những cái có thể được hỗ trợ khi phục vụ XHTML dưới dạng văn bản / html. (Chỉ cần kiểm tra chúng bằng cách kiểm tra DOM được sản xuất.)

Đối với XHTML được phân phát dưới dạng application / xhtml + xml (tạo thành XML), các quy tắc XML được áp dụng và mọi phần tử đều có thể trống (ngay cả khi XHTML DTD không thể diễn tả điều này).


4

Bạn nên xem các DTD xHTML , tất cả chúng đều được liệt kê. Dưới đây là một đánh giá nhanh tất cả những cái chính:

<br />
<hr />
<img />
<input />

1
Đã sửa và dọn dẹp đánh dấu. Cẩn thận với các liên kết trong các trang này, chúng tải chậm.
e-satis

4

Chúng được gọi là các phần tử "void" trong HTML 5. Chúng được liệt kê trong thông số W3 chính thức .

Phần tử void là một phần tử mà mô hình nội dung không bao giờ cho phép nó có nội dung trong bất kỳ trường hợp nào.

Kể từ tháng 4 năm 2013, chúng là:

khu vực, cơ sở, br, col, lệnh, nhúng, hr, img, đầu vào, keygen, liên kết, meta, param, nguồn, theo dõi, wbr

Kể từ tháng 12 năm 2018 (HTML 5.2), chúng là:

khu vực, cơ sở, br, col, nhúng, hr, img, đầu vào, liên kết, meta, param, nguồn, theo dõi, wbr


2

Một vấn đề thẻ tự đóng khác cho IE là yếu tố tiêu đề. Khi IE (chỉ dùng thử trong IE7) thấy điều này, nó sẽ hiển thị cho người dùng một trang trống. Tuy nhiên, bạn "xem nguồn" và mọi thứ đều ở đó.

<title/>

Ban đầu tôi đã thấy điều này khi XSLT của tôi tạo thẻ tự đóng.


Chromium cũng không thích <title/>thẻ.
uınbɐɥs

2

Tôi sẽ không cố gắng khắc phục điều này, đặc biệt là vì phần lớn các trang tôi viết đều được tạo hoặc thẻ có nội dung. Hai thứ duy nhất khiến tôi gặp rắc rối khi tự đóng chúng là:

<title/>

Đối với điều này, tôi chỉ đơn giản dùng đến việc luôn cung cấp cho nó một thẻ đóng riêng biệt, vì một khi nó ở trên <head></head>đó, nó không thực sự làm cho mã của bạn trở nên rắc rối hơn để làm việc với dù sao đi nữa.

<script/>

Đây là một vấn đề lớn mà gần đây tôi gặp phải vấn đề. Trong nhiều năm, tôi đã luôn sử dụng <script/>các thẻ tự đóng khi tập lệnh đến từ nguồn bên ngoài. Nhưng gần đây tôi đã bắt đầu nhận được thông báo lỗi JavaScript về một dạng rỗng. Sau nhiều ngày nghiên cứu, tôi thấy rằng vấn đề là (được cho là) ​​trình duyệt không bao giờ được <form>gắn thẻ vì nó không nhận ra đây là phần cuối của <script/>thẻ. Vì vậy, khi tôi làm nó thành các <script></script>thẻ riêng biệt , mọi thứ đều hoạt động. Tại sao khác nhau trong các trang khác nhau tôi tạo trên cùng một trình duyệt, tôi không biết, nhưng thật là một sự giải thoát lớn để tìm giải pháp!


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.