浏览器无法正确识别的原因是什么:
<script src="foobar.js" /> <!-- self-closing script element -->
只有这一点被认可:
<script src="foobar.js"></script>
这是否打破了 XHTML 支持的概念?
注意:此声明至少对所有 IE(6-8 beta 2)都是正确的。
浏览器无法正确识别的原因是什么:
<script src="foobar.js" /> <!-- self-closing script element -->
只有这一点被认可:
<script src="foobar.js"></script>
这是否打破了 XHTML 支持的概念?
注意:此声明至少对所有 IE(6-8 beta 2)都是正确的。
XHTML 1 规范说:
给定一个元素的空实例,其内容模型不是
EMPTY
(例如,空标题或段落)不要使用最小化形式(例如 use<p> </p>
和 not<p />
)。
XHTML DTD 将脚本元素指定为:
<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>
补充一下 Brad 和小队所说的,自闭合 XML 语法<script />
实际上是正确的 XML,但要使其在实践中工作,您的 Web 服务器还需要将您的文档作为格式正确的 XML 发送,并使用类似于application/xhtml+xml
HTTP 中的 XML mimetype Content-Type头(和不作为text/html
)。
但是,发送 XML mimetype 将导致您的页面不被 IE7 解析,IE7 只喜欢text/html
.
从w3:
总之,'application/xhtml+xml' 应该用于 XHTML Family 文档,'text/html' 的使用应该仅限于 HTML 兼容的 XHTML 1.0 文档。'application/xml' 和 'text/xml' 也可以使用,但在适当的时候,应该使用 'application/xhtml+xml' 而不是那些通用的 XML 媒体类型。
几个月前我对此感到困惑,唯一可行(与 FF3+ 和 IE7 兼容)的解决方案是将旧<script></script>
语法与text/html
(HTML 语法 + HTML mimetype)一起使用。
如果您的服务器text/html
在其 HTTP 标头中发送类型,即使使用其他正确格式的 XHTML 文档,FF3+ 也会使用其 HTML 呈现模式,这意味着这<script />
将不起作用(这是一个更改,Firefox 以前不太严格)。
无论对http-equiv
元元素、文档中的 XML 序言或文档类型进行任何摆弄,都会发生这种情况——Firefox 一旦获得text/html
标题就会分支,这决定了 HTML 或 XML 解析器是否查看文档内部,而 HTML 解析器不理解<script />
。
其他人已经回答了“如何”并引用了规范。这是“为什么不<script/>
”的真实故事,经过数小时深入研究错误报告和邮件列表。
HTML 4
HTML 4 基于SGML。
SGML有一些shorttags,如<BR//
,<B>text</>
,<B/text/
,或<OL<LI>item</LI</OL>
。XML 采用第一种形式,将结尾重新定义为“>”(SGML 是灵活的),因此它变成<BR/>
.
但是,HTML 没有重新调整,所以<SCRIPT/>
应该意味着 <SCRIPT>>
.
(是的,“>”应的内容部分,并且所述标签仍然不关闭。)
显然,这与 XHTML 不兼容,并且会破坏许多站点(当浏览器成熟到可以关注 这一点时),因此没有人实现短标签并且规范建议不要使用它们。
实际上,所有“工作”自端标签都是在技术上不符合标准的解析器上带有禁止结束标签的标签,实际上是无效的。是 W3C提出了这个 hack,通过使其与HTML 兼容来帮助过渡到 XHTML 。
And<script>
的结束标记不被禁止。
“自我结束”标签是 HTML 4 中的一个黑客,毫无意义。
HTML 5
HTML5 有五种类型的标签,只有 'void' 和 'foreign' 标签允许自闭合。
因为<script>
is not void(它可能有内容)并且不是外来的(如 MathML 或 SVG),<script>
所以无论您如何使用它都不能自闭。
但为什么?难道他们不能把它当作外国的,做特例的,什么的?
HTML 5个目的是向后兼容以实现它不是基于SGML或XML HTML 4和XHTML 1; 它的语法主要涉及记录和统一实现。(这就是为什么<br/>
<hr/>
等是有效的 HTML 5尽管是无效的 HTML4。)
自关闭<script>
是过去实现不同的标签之一。它用于在Chrome,Safari浏览器的工作,和Opera ; 据我所知,它从未在 Internet Explorer 或 Firefox 中工作过。
这在 HTML 5 被起草并被拒绝时讨论过,因为它破坏了 浏览器 兼容性。自动关闭脚本标记的网页在旧浏览器中可能无法正确呈现(如果有的话)。还有其他的提议,但也解决不了兼容性问题。
草案发布后,WebKit 更新了解析器以符合要求。
<script>
由于向后兼容 HTML 4 和 XHTML 1,HTML 5 中不会发生自关闭。
XHTML 1 / XHTML 5
正如其他答案所述,当真正用作 XHTML 时,<script/>
实际上是关闭的。
除了规范说,它应该在作为HTML服务工作过:
XHTML 文档 ... 可以标记为 Internet 媒体类型“text/html”[RFC2854],因为它们与大多数 HTML 浏览器兼容。
所以发生了什么事?
人们问的Mozilla以让火狐解析符合文档作为XHTML不管指定的内容头(被称为内容嗅探)。这将允许自关闭脚本,无论如何,内容嗅探是必要的,因为网络托管商还不够成熟,无法提供正确的标题;IE 很擅长。
如果第一次浏览器大战没有以 IE 6 结束,那么 XHTML 也可能会出现在列表中。但它确实结束了。并且 IE 6有XHTML的问题。其实IE不支持正确的MIME类型都,迫使大家使用text/html
,因为IE举办了XHTML主要的市场份额了整整十年。
最后,事实证明 W3C并不意味着 XHTML 是可嗅探的:文档既是HTML 又是 XHTML,也是Content-Type
规则。可以说他们坚定地坚持“只遵循我们的规范”,而忽略了实用的东西。这个错误一直延续到后来的 XHTML 版本。
不管怎样,这个决定为 Firefox解决了问题。距 Chrome诞生还有 7 年;没有其他重要的浏览器。就这样决定了。
由于以下规范,单独指定 doctype 不会触发 XML 解析。
如果有人好奇,最终的原因是 HTML 最初是 SGML 的一种方言,它是 XML 的怪异哥哥。在 SGML-land 中,元素可以在 DTD 中指定为自闭合(例如 BR、HR、INPUT)、隐式可闭合(例如 P、LI、TD)或显式可闭合(例如 TABLE、DIV、SCRIPT)。当然,XML 没有这个概念。
现代浏览器使用的 tag-soup 解析器是从这种遗留下来的,尽管它们的解析模型不再是纯 SGML。当然,除非您使用 XML mime 类型发送它,否则您精心制作的 XHTML 将被视为编写不当的 SGML 启发的标签汤。这也是为什么...
<p><div>hello</div></p>
...被浏览器解释为:
<p></p><div>hello</div><p></p>
...这是一个可爱的晦涩错误的秘诀,当您尝试针对 DOM 进行编码时,它可能会让您陷入困境。
Internet Explorer 8 及更早版本不支持 XHTML 解析。即使您使用 XML 声明和/或 XHTML 文档类型,旧的 IE 仍会将文档解析为纯 HTML。在纯 HTML 中,不支持自关闭语法。尾部斜杠只是被忽略,您必须使用显式结束标记。
即使是支持 XHTML 解析的浏览器,例如IE 9 和更高版本,仍会将文档解析为 HTML,除非您使用 XML 内容类型提供文档。但在那种情况下,旧的 IE 根本不会显示文档!