自关闭脚本标签为什么不起作用?

时间:2020-03-05 18:55:16  来源:igfitidea点击:

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

<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语法&lt;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呈现模式,这意味着&lt;script />将不起作用(这是Firefox的更改)以前不太严格)。

无论我们是否对http-equiv元标记,文档中的XML序言或者doctype有任何摆弄,都会发生这种情况-Firefox在获取text / html标头后会分支,该标头确定HTML或者XML解析器是否在文档中查找,而HTML解析器不理解&lt;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进行编码时,该错误会使我们陷入困境。