协慌网

登录 贡献 社区

为什么自关闭脚本元素不起作用?

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

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

只有这一点得到承认:

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

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

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

答案

XHTML 1 规范说:

С.3。元素最小化和空元素内容

给定内容模型不是EMPTY的元素的空实例(例如,空标题或段落)不使用最小化形式(例如,使用<p> </p>而不是<p /> )。

XHTML DTD 将脚本元素指定为:

<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>

为了增加 Brad 和 squadette 所说的,自动关闭的 XML 语法<script />实际上正确的 XML,但是为了在实践中工作,您的 Web 服务器还需要将您的文档作为具有 XML mimetype 的正确形成的 XML 发送喜欢 HTTP Content-Type 标头中的application/xhtml+xml (而不是 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 兼容)解决方案是使用带有text/html (HTML 语法 + HTML mimetype)的旧<script></script>语法。

如果您的服务器在其 HTTP 标头中发送text/html类型,即使使用其他正确形成的 XHTML 文档,FF3 + 也将使用其 HTML 呈现模式,这意味着<script />将无法工作(这是一个更改,Firefox 以前不那么严格)。

无论是否在文档中使用http-equiv元素,XML prolog 或 doctype,都会发生这种情况 - 一旦获得text/html标头,Firefox 就会分支,这将决定 HTML 或 XML 解析器是否在文档内部查看,以及 HTML 解析器不理解<script />

如果有人好奇,最终的原因是 HTML 最初是 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 进行编码时,它会让你陷入困境。