自关闭脚本标签为什么不起作用?
浏览器无法正确识别的原因是什么:
<script src="foobar.js" /> <!-- self-closing script tag -->
只有这是公认的:
<script src="foobar.js"></script>
这是否打破了XHTML支持的概念?
注意:此声明至少对于所有IE(6-8 beta 2)都是正确的。
解决方案
回答
XHTML 1规范说:
.3. 元素最小化和空元素内容
Given an empty instance of an element whose content model is not EMPTY (for example, an empty title or paragraph) do not use the minimized form (e.g. use <p> </p> and not <p />).
XHTML DTD将脚本标签指定为:
<!-- script statements, which may include CDATA sections --> <!ELEMENT script (#PCDATA)>
回答
与XML和XHTML不同,HTML不了解自动关闭语法。将XHTML解释为HTML的浏览器不知道/
字符表示该标签应该是自动关闭的。取而代之的是,他们将其解释为空属性,并且解析器仍然认为标记为"打开"。
就像将<script defer>视为<script defer =" defer">一样,将<script />视为<script / =" /">。
回答
Internet Explorer 8和更早版本不支持XHTML解析。即使我们使用XML声明和/或者XHTML文档类型,旧版IE仍会将文档解析为纯HTML。在纯HTML中,不支持自动关闭语法。尾部的斜杠只是被忽略,我们必须使用一个显式的结束标记。
即使支持XHTML解析的浏览器(如IE 9和更高版本)仍将文档解析为HTML,除非我们使用XML内容类型提供文档。但是在那种情况下,旧的IE根本不会显示文档!
回答
要补充Brad和squadette所说的话,自动关闭的XML语法<script />
实际上是正确的XML,但是要使其在实践中起作用,Web服务器还需要将文档以格式正确的XML发送给XML MIME类型,例如HTTP Content-Type标头中的" application / xhtml + xml"(而不是" text / html")。
但是,发送XML模仿类型将导致页面无法被IE7解析,IE7只喜欢text / html
。
从w3:
In summary, 'application/xhtml+xml' SHOULD be used for XHTML Family documents, and the use of 'text/html' SHOULD be limited to HTML-compatible XHTML 1.0 documents. 'application/xml' and 'text/xml' MAY also be used, but whenever appropriate, 'application/xhtml+xml' SHOULD be used rather than those generic XML media types.
几个月前,我对此感到困惑,唯一可行的(与FF3 +和IE7兼容)解决方案是将旧的<script> </ script>语法与text / html(HTML语法+ HTML mimetype)一起使用。
如果服务器在其HTTP标头中发送text / html
类型,即使使用其他格式正确的XHTML文档,FF3 +仍将使用其HTML呈现模式,这意味着<script />
将不起作用(这是Firefox的更改)以前不太严格)。
无论我们是否对http-equiv
元标记,文档中的XML序言或者doctype有任何摆弄,都会发生这种情况-Firefox在获取text / html
标头后会分支,该标头确定HTML或者XML解析器是否在文档中查找,而HTML解析器不理解<script />
。
回答
Internet Explorer 8和更早的版本不支持XHTML的正确MIME类型,即application / xhtml + xml。如果我们将XHTML用作"文本/ html",而这些旧版本的Internet Explorer必须执行此操作,则它将被解释为HTML 4.01. 我们只能将short语法与任何允许省略结束标记的元素一起使用。请参阅HTML 4.01规范。
XML"短格式"被解释为名为/的属性,(因为没有等号)被解释为具有" /"的隐式值。在HTML 4.01中,这是完全错误的,不允许使用未声明的属性,但浏览器将忽略它。
IE9和更高版本支持XHTML 5以及application / xhtml + xml
。
回答
上面的人已经很好地解释了这个问题,但是可以使事情变得清楚的一件事是,尽管人们一直在使用HTML文档中的"'<br/>'之类的东西,但是任何''/'
都可以。这样的位置基本上被忽略,仅在试图使两者都可解析为XML和HTML时使用。例如,尝试使用''<p /> foo </ p>'`,我们将获得一个普通段落。
回答
万一有人好奇,最终的原因是HTML最初是SGML的方言,SGML是XML的怪异哥哥。在SGML区域中,标签可以在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>
...这是一个可爱的,难以理解的错误的秘诀,当我们尝试对DOM进行编码时,该错误会使我们陷入困境。