浏览器无法正确识别的原因是什么:
<script src="foobar.js" /> <!-- self-closing script element -->
只有这一点得到承认:
<script src="foobar.js"></script>
这是否打破了 XHTML 支持的概念?
注意:此声明至少对所有 IE(6-8 beta 2)都是正确的。
XHTML 1 规范说:
给定内容模型不是
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 进行编码时,它会让你陷入困境。