XHTML中所有有效的自闭合元素是什么(由主要浏览器实现)?

195

所有主流浏览器都支持哪些有效的自闭合元素(例如<br/>),在XHTML中哪些是可以使用的?

我知道XHTML技术上允许任何元素都可以自闭合,但我正在寻找由所有主流浏览器支持的自闭合元素列表。请参见http://dusan.fora.si/blog/self-closing-tags,其中有一些由于使用自闭合元素(如<div />)而导致问题的示例。


7
这难道不是违反XHTML的目标之一吗?我原以为XHTML的优点之一是你可以使用XML生成器来生成HTML。但是,为什么任何XML生成器都要知道哪些标签可以自闭合呢?这也太奇怪了。 - Elijah
6
“瘸腿”、“不正确”的答案之所以被接受,是因为它回答了Kamens显然在问的问题。他想知道哪些元素在将XHTML作为text/html提供时可以自闭合而不会导致浏览器呈现问题。许多页面都是用XHTML编写的,并作为text/html提供,即使这在技术上是不正确的。该问题可以通过这一澄清来改善,但回答不同的问题(例如:当您作为application/xml提供时会发生什么,或者text/html中的单数标记是否应具有封闭/)在这种情况下没有帮助。 - Nick Lockwood
13个回答

186

每个支持XHTML的浏览器(Firefox,Opera,Safari,IE9)都支持在每个元素上使用自闭语法。

<div/>, <script/>, <br></br> 都应该正常工作。如果不行,那么您使用的是不适当添加XHTML DOCTYPE的HTML

DOCTYPE不会改变文档的解释方式。只有MIME类型才能改变

W3C关于忽略DOCTYPE的决定:

HTML WG已经讨论过这个问题:意图是通过遵循指南并将它们作为text/html呈现,允许旧的(仅限HTML)浏览器接受XHTML 1.0文档。因此,作为text/html的文档应该被视为HTML而不是XHTML。

这是一个非常普遍的陷阱,因为W3C验证器在很大程度上忽略了这个规则,但浏览器都遵循它。请阅读 WebKit 博客中的理解 HTML、XML 和 XHTML

事实上,互联网上绝大多数所谓的XHTML文档都是以text/html格式提供的。这意味着它们根本不是XHTML,而实际上是通过HTML解析器的错误处理获得通过的无效HTML。所有那些“有效的XHTML 1.0!”的链接实际上都是在说“无效的HTML 4.01!”。


要测试您是否使用真正的XHTML或带有XHTML DOCTYPE的无效HTML,请将以下内容放入您的文档中:

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

它是有效的,并且在真正的XHTML中它可以完美运作(请参见:12)。如果您无法相信自己的眼睛(或不知道如何设置MIME类型),请通过XHTML代理打开您的页面。

另一种检查方法是在Firefox中查看源代码。当斜杠无效时,它将以红色突出显示。

在HTML5 / XHTML5中,这没有改变,而且区别更加明显,因为您甚至没有其他DOCTYPEContent-Type才是最重要的。


值得注意的是,XHTML规范允许通过将XHTML作为XML应用程序来关闭任何元素的自我封闭:[强调是我的]

空元素标记可用于任何没有内容的元素,无论是否使用关键字EMPTY进行声明。

这也明确说明在XHTML规范中:

空元素必须具有结束标记,或者起始标记必须以/>结尾。例如,<br/><hr></hr>


7
据我所知,这并不正确,因为使用自闭合版本的<script><div>会导致不同的呈现/解释。 - ZeissS
14
只有在 text/html 中才会出现问题。在作为 application/xhtml+xml 发送的真正的 XHTML 中,它可以正常工作。在投票之前,请先阅读我链接的文章(或 XHTML 规范的附录 C)。 - Kornel
3
@pornel,你能保证自闭合的<script/>标签在旧版浏览器中能够正常工作吗?我认为不行。你听起来很有权威性,大部分信息都是准确的,但经验告诉我,自闭合的脚本标签可能会出现问题,最好完全避免它们,以免给自己带来麻烦。 - Metagrapher
6
如果旧版浏览器不支持真正的XHTML,或者您未能设置MIME类型,则它将无法工作。但是,在支持XHTML的浏览器中(目前所有主要浏览器),只有在使用application/xhtml+xml MIME类型时,我才能保证<script/>将起作用。仅限于MIME类型。 - Kornel
4
旧版浏览器不支持XHTML(作为“application/xhtml+xml”提供)。如果您将XHTML文档作为“text/html”发送给它们,则浏览器会将XHTML呈现为标签混乱(即,浏览器将其解析为HTML,并将自闭合标签视为错误,但它可以优雅地恢复)。您的选择是:1.编写HTML 4(如果使用ASP.NET渲染XHTML,则不是一个选项),2.将XHTML作为“application/xhtml+xml”提供(需要IE9+,而且此MIME类型也会在所有浏览器中破坏脚本,因此绝不是一个选项),3.编写HTML 5,这基本上使标签混乱成为标准 :) - Triynko
显示剩余15条评论

42

在这个话题上需要格外小心的一个元素是 <script> 元素。如果你有一个外部源代码文件,在自我关闭时它会导致问题。试一下:

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

这在Firefox中能够正常工作,但在至少IE6中会出现问题。我知道,因为当我过于热衷于自我封闭每个元素时,遇到了这个问题。


影响所有版本的MSIE:http://webbugtrack.blogspot.com/2007/08/bug-153-self-closing-script-tag-issues.html - scunliffe
4
在Firefox 3中,<script>标签不能自我关闭。 - hsivonen
以前在 Firefox 中遇到时它是可以工作的。现在似乎在任何浏览器中都无法工作了。也许只能在怪异模式下工作? - Erik van Brakel
1
@erickson 如果能正确设置MIME类型,它在Firefox中可以正常工作。 - Kornel
WebKit出于兼容性原因继续执行此操作。 - Yuhong Bao

37
自闭合语法适用于应用程序/xhtml+xml中的所有元素。虽然在text/html中不支持任何元素的自闭合语法,但是在HTML4中为空的元素或在HTML5中为"void"的元素本身就不需要使用结束标签,因此如果您在这些元素上加上斜杠,则会出现似乎支持自闭合语法的情况。

35

7
我看到有12个以/>结尾的标签:"area"、"base"、"basefont"、"br"、"col"、"frame"、"hr"、"img"、"input"、"link"、"meta"和"param"。 - mpen
96
请注意,W3schools与W3C没有关联,并且甚至无法回应由W3C成员发送的更正请求。 - Kornel
2
就像经常发生的那样,w3schools几乎是正确的。查找空元素的准确方法是运行grep EMPTY xhtml1-strict.dtd | sortgrep EMPTY xhtml1-transitional.dtd | sort - cayhorstmann
2
在我看来,人们对W3Schools的批评过于严厉了。它已经证明自己是一个非常好的资源,特别是当你开始接触一些你完全不了解的主题时。 - Priidu Neemre

33

12

希望这能帮助到某个人:

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

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

7
在HTML 5中,它们被称为"空元素"。它们在官方W3规范中列出。

空元素是指其内容模型在任何情况下都不允许其具有内容的元素。

截至2013年4月,它们是:

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

截至2018年12月(HTML 5.2版本),它们是:

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


7

那么 <meta><link> 呢?为什么它们不在这个列表中?

一个快速的经验法则是,不要自闭任何预期有内容的元素,因为它肯定会在早晚间导致浏览器问题。

那些天然自闭的元素,像 <br><img>,应该是很明显的。那些不是...就不要自闭它们!


6

您应该查看xHTML DTDs,它们都列在那里。以下是所有主要DTD的快速概述:

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

1
固定和清理标记。注意此页面中的链接,它们加载速度较慢。 - Bite code

6
我上次检查时,以下是HTML5中列出的空/无效元素。
对作者有效:area、base、br、col、command、embed、eventsource、hr、img、input、link、meta、param、source 对作者无效:basefont、bgsound、frame、spacer、wbr 除了在HTML5中新增的几个元素外,这应该可以让你了解在将XHTML作为text/html进行服务时可能支持的元素。(只需通过检查生成的DOM来测试它们。)
至于作为application/xhtml+xml(使其成为XML)提供的XHTML,则适用XML规则,任何元素都可以为空(即使XHTML DTD不能表达此内容)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接