浏览器无法正确识别的原因是什么:

<script src="foobar.js" /> <!-- self-closing script element -->

只有这一点是公认的:

<script src="foobar.js"></script>

这是否打破了XHTML支持的概念?

注意:此声明至少对所有IE(6-8 beta 2)都是正确的。


当前回答

其他人回答了“如何”,并引用了规范。经过几个小时的研究,这里是“为什么不<script/>”的真实故事。


HTML 4

HTML4基于SGML。

SGML有一些短标记,例如<BR//、<B>text</>、<B/text/或<OL<LI>item</LI</OL>。XML采用第一种形式,将结尾重新定义为“>”(SGML是灵活的),因此它变成<BR/>。

然而,HTML并不是红色的,所以<SCRIPT/>应该意味着<SCRIPT>>。(是的,“>”应该是内容的一部分,标记仍然未关闭。)

显然,这与XHTML不兼容,并且会破坏许多网站(到浏览器成熟到可以考虑这一点时),因此没有人实现短标签,规范建议不要使用短标签。

实际上,所有“工作”的自结束标记都是在技术上不一致的解析器上带有禁止结束标记的标记,实际上是无效的。正是W3C想出了这个破解方法,通过使XHTML与HTML兼容来帮助过渡到XHTML。

<script>的结束标记不被禁止。

“Self-ending”标签是HTML4中的一个黑客,没有任何意义。


HTML 5

HTML5有五种类型的标记,只有“void”和“foreign”标记可以自动关闭。

因为<script>不是空的(它可能有内容),也不是外来的(像MathML或SVG),所以无论您如何使用<script>,它都不能自我关闭。

但为什么?难道他们不能把它看作是外国的吗?

HTML5旨在向后兼容HTML4和XHTML1的实现。它不是基于SGML或XML;它的语法主要涉及记录和合并实现。(这就是为什么<br/><hr/>等是有效的HTML5,而不是无效的HTML4。)

自我关闭<script>是过去实现不同的标记之一。它曾经在Chrome、Safari和Opera中运行;据我所知,它从未在Internet Explorer或Firefox中运行过。

这是在HTML5起草时讨论过的,因为它破坏了浏览器兼容性而被拒绝。在旧浏览器中,自关闭脚本标记的网页可能无法正确呈现(如果有的话)。还有其他建议,但它们也不能解决兼容性问题。

草案发布后,WebKit将解析器更新为一致。

由于向后兼容HTML4和XHTML1,HTML5中不会出现自动关闭<script>。


XHTML 1/XHTML 5

当真正用作XHTML时,<script/>实际上是关闭的,正如其他答案所述。

除了规范中说它应该在用作HTML时工作:

XHTML文档。。。可以标记为Internet媒体类型“text/html”[RFC2854],因为它们与大多数html浏览器兼容。

那么,发生了什么?

人们要求Mozilla允许Firefox将符合标准的文档解析为XHTML,而不考虑指定的内容头(称为内容嗅探)。这将允许自动关闭脚本,无论如何,内容嗅探都是必要的,因为web宿主还不够成熟,无法提供正确的标头;IE很擅长。

如果第一次浏览器大战没有以IE6结束,XHTML可能也在名单上。但它确实结束了。IE 6有XHTML的问题。事实上,IE根本不支持正确的MIME类型,迫使每个人都为XHTML使用text/html,因为IE占据了整整十年的主要市场份额。

此外,内容嗅探也可能非常糟糕,人们认为应该停止。

最后,事实证明,W3C并不意味着XHTML是可窥探的:文档既是HTML又是XHTML,以及内容类型规则。人们可以说,他们坚持“只遵循我们的规范”,而忽视了什么是实际的。这个错误一直延续到后来的XHTML版本。

无论如何,这个决定解决了Firefox的问题。Chrome诞生前7年;没有其他重要的浏览器。就这样决定了。

由于以下规范,单独指定doctype不会触发XML分析。

其他回答

自动关闭的脚本标记不起作用,因为脚本标记可以包含内联代码,而HTML不够聪明,无法根据属性的存在来启用或禁用该功能。

另一方面,HTML确实有一个很好的标记,用于包括对外部资源的引用:<link>标记,它可以是自动关闭。它已经用于包括样式表、RSS和Atom提要、规范URI和其他各种好东西。为什么不呢?JavaScript?

如果你想让脚本标签是自我封闭的,你不能像我所说的那样做,但有一个替代方案,尽管不是一个聪明的方案。您可以使用自动关闭的链接标记,并通过为其提供一种text/JavaScript和rel as脚本来链接到JavaScript,如下所示:

<link type="text/javascript" rel ="script" href="/path/tp/javascript" />

如果有人好奇的话,最终的原因是HTML最初是SGML的一种方言,而SGML是XML奇怪的哥哥。在SGML land中,元素可以在DTD中指定为自关闭(例如BR、HR、INPUT)、隐式可关闭(例如P、LI、TD)或显式可关闭的(例如TABLE、DIV、SCRIPT)。当然,XML对此没有概念。

现代浏览器使用的标签汤解析器是从这一传统演变而来的,尽管它们的解析模型不再是纯SGML。当然,除非您使用XML mime类型发送,否则精心制作的XHTML会被视为编写糟糕的SGML标签汤。这也是为什么。。。

<p><div>hello</div></p>

…被浏览器解释为:

<p></p><div>hello</div><p></p>

……这是一个可爱的、晦涩难懂的bug的配方,当您尝试对DOM进行编码时,它会让您陷入困境。

“真XHTML”、“伪XHTML”和“普通HTML”之间的区别以及服务器发送的MIME类型的重要性在这里已经很好地描述了。

如果您想立即尝试,这里有一个简单的可编辑片段,带有实时预览,包括自关闭的脚本标记(请参见<script src=“data:text/javascript,/*functional*/”/>)和XML实体(不相关,请参见&x;)。

正如您所看到的,根据嵌入文档的MIME类型,数据URI JavaScript功能要么执行并显示连续文本(在application/xhtml+xml模式下),要么不执行并由脚本“吞噬”连续文本(以text/html模式下)。

div{display:flex;}div+div{flex direction:列;}<div>Mime类型:<label><input type=“radio”onchange=“t.onkeyup()”id=“x”checked name=“Mime”>application/xhtml+xml</label><label><inputtype=“radio”onchange=“t.onkeyup()”name=“mime”>text/html</label></div><div><textarea id=“t”rows=“4”onkeyup=“i.src='data:'+(x.checked?'application/xhtml+xml':'text/html')+','+encodeURIComponent(t.value)”><?xml版本=“1.0”?><!DOCTYPE html PUBLIC“//W3C//DTD XHTML 1.0严格//EN”http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"[<!ENTITY x“true XHTML”>]><html xmlns=“http://www.w3.org/1999/xhtml"><body><p><span id=“greet”swapto=“Hello”>见鬼,没有:(</span>&x;。<script src=“data:text/javascript,(g=document.getElementById('greet')).innerText=g.getAttribute('swapto')”/>很高兴认识你!<!-- 上一个文本节点和所有其他内容在text/html模式下属于SCRIPT元素内容,因此不会呈现。因为没有找到结束脚本标记,所以没有脚本在text/html中运行--></p></body></html></textarea><iframe id=“i”height=“80”></iframe><script>t.onkeyup()</script></div>

您应该看到Hello,真正的XHTML。很高兴认识你!文本区域下方。

对于没有能力的浏览器,您可以复制文本区域的内容,并将其保存为扩展名为.xhtml(或.xht)的文件(感谢Alek的提示)。

上面的人已经大致解释了这个问题,但有一点可能会让事情变得很清楚,尽管人们一直在HTML文档中使用<br/>等,但这种位置上的任何/基本上都被忽略了,只有在试图使某种东西既可解析为XML又可解析为HTML时才使用。例如,尝试<p/>foo</p>,就会得到一个常规段落。

简单地说,现代的答案是因为标签以这种方式表示为强制性的

标记省略无,开始标记和结束标记都是必填的。

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script