浏览器无法正确识别的原因是什么:
<script src="foobar.js" /> <!-- self-closing script element -->
只有这一点被认可:
<script src="foobar.js"></script>
这会破坏 XHTML 支持的概念吗?
注意:至少对于所有 IE (6-8 beta 2),此语句都是正确的。
XHTML 1 规范的非规范性附录“HTML 兼容性指南”说:
С.3. Element Minimization and Empty Element Content
给定一个内容模型不是 EMPTY 的元素的空实例(例如,空标题或段落),不要使用最小化形式(例如,使用
而不是 )。
XHTML DTD 将脚本元素指定为:
<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>
为了补充 Brad 和小队所说的内容,自闭合 XML 语法 <script />
实际上 是 正确的 XML,但要使其在实践中工作,您的 Web 服务器还需要正确发送您的文档在 HTTP Content-Type 标头中使用类似 application/xhtml+xml
的 XML mimetype 形成 XML(并且 not 作为 text/html
)。
但是,发送 XML mimetype 会导致您的页面无法被 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)。
如果您的服务器在其 HTTP 标头中发送 text/html
类型,即使是格式正确的 XHTML 文档,FF3+ 也会使用其 HTML 呈现模式,这意味着 <script />
将不起作用(这是一个变化,Firefox 以前不那么严格) .
无论对 http-equiv
元元素、文档中的 XML prolog 或 doctype 进行任何摆弄,都会发生这种情况 - Firefox 一旦获得 text/html
标头就会分支,该标头确定 HTML 或 XML 解析器是否在文档内部查找,并且HTML 解析器不理解 <script />
。
.html
文件呈现为标签汤,而不管元标签如何。对于 XHTML 文件,Firefox 只会在它们被命名为 .xhtml
时相应地呈现它们。
application/xhtml+xml
,而不是 text/xml
。
其他人回答了“如何”并引用了规范。这是“为什么没有 <script/>
”的真实故事,经过数小时深入研究错误报告和邮件列表。
HTML 4
HTML 4 基于 SGML。
SGML 有一些 shorttags,例如 <BR//
、<B>text</>
、<B/text/
或 <OL<LI>item</LI</OL>
。 XML 采用第一种形式,将结尾重新定义为“>” (SGML 是灵活的),所以它变成了<BR/>
。
但是,HTML 没有重新定义,所以 <SCRIPT/>
should mean <SCRIPT>>
。
(是的,'>' 应该是内容的一部分,并且标签仍然没有关闭。)
显然,这与 XHTML 不兼容,将破坏许多网站(到浏览器足够成熟的时候 to care about this),所以 nobody implemented shorttags 和规范 advises against them。
实际上,所有“工作”的自结束标签都是在技术上不符合标准的解析器上带有禁止结束标签的标签,实际上是无效的。正是 W3C came up with this hack 通过将 XHTML 设为 HTML-compatible 来帮助过渡到 XHTML。
<script>
的结束标记是 not prohibited。
“自结束”标签是 HTML 4 中的一个 hack,没有任何意义。
HTML 5
HTML5 有 five types of tags,只有 'void' 和 'foreign' 标签是 allowed to be self-closing。
因为 <script>
不是 void(它可能有内容)并且不是外来的(如 MathML 或 SVG),所以无论您如何使用它,<script>
都不能自闭合。
但为什么?他们不能把它当作外国的,做特例之类的吗?
HTML 5 旨在backward-compatible具有 HTML 4 和 XHTML 1 的实现。它不是基于 SGML 或 XML;它不是基于 SGML 或 XML。它的语法主要涉及记录和统一实现。 (这就是为什么 <br/>
<hr/>
等是 valid HTML 5 尽管 HTML4 无效。)
自闭合 <script>
是实现曾经不同的标签之一。它used to work in Chrome, Safari,and Opera;据我所知,它从未在 Internet Explorer 或 Firefox 中运行过。
This was discussed HTML 5 正在起草并被拒绝,因为它breaks browser compatibility。自关闭脚本标签的网页可能无法在旧浏览器中正确呈现(如果有的话)。有other proposals,但它们也不能解决兼容性问题。
草案发布后,WebKit 更新了解析器以使其符合要求。
自关闭 <script>
在 HTML 5 中不会发生,因为它向后兼容 HTML 4 和 XHTML 1。
XHTML 1 / XHTML 5
当 真正 用作 XHTML 时,<script/>
确实是封闭的,正如 other answers 所述。
除了the spec says它应该在作为 HTML 服务时可以工作:
XHTML 文档 ... 可以使用 Internet 媒体类型“text/html”[RFC2854] 进行标记,因为它们与大多数 HTML 浏览器兼容。
所以发生了什么事?
无论指定的内容标题(称为 content sniffing)如何,人们 asked Mozilla 到 let Firefox parse 都将文档符合 XHTML。这将允许自动关闭脚本和内容嗅探was necessary,因为网络托管商还不够成熟,无法提供正确的标头; IE 是 good at it。
如果 first browser war 没有以 IE 6 结尾,那么 XHTML 可能也在列表中。但它确实结束了。以及带有 XHTML 的 IE 6 has a problem。事实上,IE did not support 是正确的 MIME 类型 at all,迫使每个人将 text/html
用于 XHTML,因为 IE 保持 major market share 整整十年。
还有内容嗅探can be really bad,人们说it should be stopped。
最后,事实证明 W3C didn't mean XHTML to be sniffable:文档是 both、HTML 和 XHTML,以及 Content-Type
规则。可以说他们坚定地坚持“只遵循我们的规范”和ignoring what was practical。 continued 到后来的 XHTML 版本中的一个错误。
无论如何,这个决定settled the matter适用于 Firefox。比 Chrome was born 早了 7 年;没有其他重要的浏览器。就这样决定了。
由于以下规范,单独指定 doctype 不会触发 XML 解析。
您应该会在 textarea 下方看到 Hello, true XHTML. Nice to meet you!
。
对于无法使用的浏览器,您可以复制 textarea 的内容并将其保存为具有 .xhtml
(或 .xht
)扩展名 (thanks Alek for this hint) 的文件。
<script />
的问题不在于规范不允许,而是如果内容类型不是 application/xhtml+xml,浏览器不会将其解释为“non-tag-soup”。请参阅:stackoverflow.com/questions/348736/… @shabunc:浏览器可能似乎理解它,但实际发生的是将内容放在 <p/> 之后。 inside 段落,由于将小队的引述解释为自 <p>是非空的,它不能自闭。在 XHTML 1.1 中,它可以自动关闭。