What are all the valid self-closing elements (e.g.
) in XHTML (as implemented by the major browsers)?
I know that XHTML technically allows any element to
Every browser that supports XHTML (Firefox, Opera, Safari, IE9) supports self-closing syntax on every element.
<div/>
, <script/>
, <br></br>
all should work just fine. If they don't, then you have HTML with inappropriately added XHTML DOCTYPE.
DOCTYPE does not change how document is interpreted. Only MIME type does.
W3C decision about ignoring DOCTYPE:
The HTML WG has discussed this issue: the intention was to allow old (HTML-only) browsers to accept XHTML 1.0 documents by following the guidelines, and serving them as text/html. Therefore, documents served as text/html should be treated as HTML and not as XHTML.
It's a very common pitfall, because W3C Validator largely ignores that rule, but browsers follow it religiously. Read Understanding HTML, XML and XHTML from WebKit blog:
In fact, the vast majority of supposedly XHTML documents on the internet are served as
text/html
. Which means they are not XHTML at all, but actually invalid HTML that’s getting by on the error handling of HTML parsers. All those “Valid XHTML 1.0!” links on the web are really saying “Invalid HTML 4.01!”.
To test whether you have real XHTML or invalid HTML with XHTML's DOCTYPE, put this in your document:
<span style="color:green"><span style="color:red"/>
If it's red, it's HTML. Green is XHTML.
</span>
It validates, and in real XHTML it works perfectly (see: 1 vs 2). If you can't believe your eyes (or don't know how to set MIME types), open your page via XHTML proxy.
Another way to check is view source in Firefox. It will highlight slashes in red when they're invalid.
In HTML5/XHTML5 this hasn't changed, and the distinction is even clearer, because you don't even have additional DOCTYPE
. Content-Type
is the king.
For the record, the XHTML spec allows any element to be self-closing by making XHTML an XML application: [emphasis mine]
Empty-element tags may be used for any element which has no content, whether or not it is declared using the keyword EMPTY.
It's also explicitly shown in the XHTML spec:
Empty elements must either have an end tag or the start tag must end with
/>
. For instance,<br/>
or<hr></hr>
The self-closing syntax works on all elements in application/xhtml+xml. It isn’t supported on any element in text/html, but the elements that are “empty” in HTML4 or “void” in HTML5 don’t take an end tag anyway, so if you put a slash on those it appears as though the self-closing syntax were supported.
From the W3 Schools reference site:
<area />
<base />
<basefont />
<br />
<hr />
<input />
<img />
<link />
<meta />
One element to be very careful with on this topic is the <script
> element. If you have an external source file, it WILL cause problems when you self close it. Try it:
<!-- this will not consistently work in all browsers! -->
<script type="text/javascript" src="external.js" />
This will work in Firefox, but breaks in IE6 at least. I know, because I ran into this when over-zealously self closing every element I saw ;-)
The last time I checked, the following were the empty/void elements listed in HTML5.
Valid for authors: area, base, br, col, command, embed, eventsource, hr, img, input, link, meta, param, source
Invalid for authors: basefont, bgsound, frame, spacer, wbr
Besides the few that are new in HTML5, that should give you an idea of ones that might be supported when serving XHTML as text/html. (Just test them by examining the DOM produced.)
As for XHTML served as application/xhtml+xml (which makes it XML), XML rules apply and any element can be empty (even though the XHTML DTD can't express this).
Another self closing tag problem for IE is the title element. When IE (just tried it in IE7) sees this, it presents the user a blank page. However you "view source" and everything is there.
<title/>
I originally saw this when my XSLT generated the self closing tag.