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

IT技术 javascript html internet-explorer xhtml
2021-02-02 19:50:27

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

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

只有这一点被认可:

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

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

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

6个回答

XHTML 1 规范说:

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

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

XHTML DTD 将脚本元素指定为:

<!-- script statements, which may include CDATA sections -->
<!ELEMENT script (#PCDATA)>
尽管如此,“不要”与“不得”是不一样的。这是一个准则(为了兼容性,正如章节标题所建议的那样),而不是规则。
2021-03-12 19:50:27
问题<script />不在于规范不允许它,而是如果内容类型不是 application/xhtml+xml,浏览器不会将其解释为“非标签汤”。请参阅:stackoverflow.com/questions/348736/... @shabunc:浏览器似乎可以理解它,但实际发生的情况是将内容放在段落<p/> 之后,因为将小队的引用解释为,因为 < p> 非空,不能自闭。在 XHTML 1.1 中,它可以是自关闭的。
2021-03-24 19:50:27
实际上,我找不到此限制的任何用途:) 这似乎完全是人为的。
2021-03-27 19:50:27
olavk 给出了正确的答案。XHTML 1.0 的附录 C 不是事物之所以如此的原因——它只是如何解决事物的方式。
2021-03-28 19:50:27
它不是规范的规范部分。不支持XHTML的浏览器如何处理只是附录
2021-04-03 19:50:27

补充一下 Brad 和小队所说的,自闭合 XML 语法<script />实际上正确的 XML,但要使其在实践中工作,您的 Web 服务器还需要将您的文档作为格式正确的 XML 发送,并使用类似于application/xhtml+xmlHTTP 中的 XML mimetype Content-Type头(和作为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 兼容)的解决方案是将旧<script></script>语法与text/html(HTML 语法 + HTML mimetype)一起使用。

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

无论对http-equiv元元素、文档中的 XML 序言或文档类型进行任何摆弄,都会发生这种情况——Firefox 一旦获得text/html标题就会分支,这决定了 HTML 或 XML 解析器是否查看文档内部,而 HTML 解析器不理解<script />

那么得出这样的结论是否正确?如果您放弃对 IE7 的支持,发送 text/xml 将使您获得对 <script/> 的广泛浏览器支持?
2021-03-09 19:50:27
@克里斯莫斯基尼。可能,但使用application/xhtml+xml,而不是text/xml
2021-03-15 19:50:27
因此,简而言之,只有当页面的 MIME 类型为 xhtml/xml 时,<script/> 才会起作用。对于常规文本/html 页面,它不起作用。并且如果我们尝试使用“xhtml/xml”MIME 类型,它将破坏 IE 兼容性。总而言之,保持冷静并使用 <script> ... </script> 谢谢 Joe ;-)
2021-03-16 19:50:27
很好的解释。另一点值得注意的是.html,出于类似的原因,Firefox 也会将本地文件呈现为标签汤,而不管元标签如何。对于 XHTML 文件,Firefox 只会在命名为.xhtml.
2021-04-02 19:50:27

其他人已经回答了“如何”并引用了规范。这是“为什么不<script/>的真实故事,经过数小时深入研究错误报告和邮件列表。


HTML 4

HTML 4 基于SGML

SGML有一些shorttags,如<BR//<B>text</><B/text/,或<OL<LI>item</LI</OL>XML 采用第一种形式,将结尾重新定义为“>”(SGML 是灵活的),因此它变成<BR/>.

但是,HTML 没有重新调整,所以<SCRIPT/> 应该意味着 <SCRIPT>>.
(是的,“>”应的内容部分,并且所述标签仍然关闭。)

显然,这与 XHTML 不兼容,并且破坏许多站点(当浏览器成熟到可以关注 这一点时),因此没有人实现短标签并且规范建议不要使用它们

实际上,所有“工作”自端标签都是在技术上不符合标准的解析器上带有禁止结束标签的标签,实际上是无效的。是 W3C提出了这个 hack,通过使其与HTML 兼容来帮助过渡到 XHTML

And<script>的结束标记不被禁止

“自我结束”标签是 HTML 4 中的一个黑客,毫无意义。


HTML 5

HTML5 有五种类型的标签,只有 'void' 和 'foreign' 标签允许自闭合

因为<script>is not void(它可能有内容)并且不是外来的(如 MathML 或 SVG),<script>所以无论您如何使用它都不能自闭。

但为什么?难道他们不能把它当作外国的,做特例的,什么的?

HTML 5个目的是向后兼容实现它不是基于SGML或XML HTML 4和XHTML 1; 它的语法主要涉及记录和统一实现。(这就是为什么<br/> <hr/>等是有效的 HTML 5尽管是无效的 HTML4。)

自关闭<script>是过去实现不同的标签之一。用于在Chrome,Safari浏览器的工作和Opera ; 据我所知,它从未在 Internet Explorer 或 Firefox 中工作过。

在 HTML 5 被起草并被拒绝时讨论过,因为它破坏了 浏览器 兼容性自动关闭脚本标记的网页在旧浏览器中可能无法正确呈现(如果有的话)。还有其他的提议,但也解决不了兼容性问题。

草案发布后,WebKit 更新了解析器以符合要求。

<script>由于向后兼容 HTML 4 和 XHTML 1,HTML 5 中不会发生自关闭


XHTML 1 / XHTML 5

正如其他答案所述真正用作 XHTML 时,<script/>实际上是关闭的

除了规范说,应该在作为HTML服务工作过:

XHTML 文档 ... 可以标记为 Internet 媒体类型“text/html”[RFC2854],因为它们与大多数 HTML 浏览器兼容。

所以发生了什么事?

人们问的Mozilla让火狐解析符合文档作为XHTML不管指定的内容头(被称为内容嗅探)。这将允许自关闭脚本,无论如何,内容嗅探是必要的,因为网络托管商还不够成熟,无法提供正确的标题;IE 很擅长

如果第一次浏览器大战没有以 IE 6 结束,那么 XHTML 也可能会出现在列表中。但它确实结束了。并且 IE 6XHTML的问题其实IE不支持正确的MIME类型,迫使大家使用text/html,因为IE举办了XHTML主要的市场份额了整整十年。

而且内容嗅探可能 真的很糟糕,人们说应该停止它

最后,事实证明 W3C并不意味着 XHTML 是可嗅探的:文档既是HTML 又是 XHTML,也是Content-Type规则。可以说他们坚定地坚持“只遵循我们的规范”,而忽略了实用的东西这个错误一直延续到后来的 XHTML 版本。

不管怎样,这个决定为 Firefox解决了问题距 Chrome诞生还有 7 年没有其他重要的浏览器。就这样决定了。

由于以下规范,单独指定 doctype 不会触发 XML 解析。

@AndyE 当你写自闭 <script> 时,当时主流浏览器都认为它没有关闭,会将子序列 html 解析为 javascript,导致有效的 HTML5 在这些旧浏览器上被破解。因此,该提议被拒绝。这在链接的 HTML5 邮件列表中进行了解释。
2021-03-09 19:50:27
一点更正:在 HTML 中看起来像自闭的标签不是带有可选结束标签的标签,而是带有禁止结束标签(空标签或无效标签)的标签。带有可选结束标签的标签(如<p>or <li>)不能“自关闭”,因为它们可以包含内容,因此类似的代码<p/>只不过是(格式错误的)开始标签及其后的内容(如果在此元素中允许) ,最终会进入其中。
2021-03-21 19:50:27
非常被低估的答案
2021-03-22 19:50:27
@AndyE:您所描述的是向前兼容性——旧代码与新编译器/解释器/解析器一起工作的能力。向后兼容性是新代码与旧编译器/解释器/解析器一起工作的能力。所以是的,向后兼容性是一个问题,否则使用新规范编写的页面将无法在旧浏览器中运行(是的,尝试使新代码尽可能在旧浏览器中运行是 Web 编程的传统)。
2021-03-25 19:50:27
@Dmitry 现实是,禁止自闭脚本是一条单向路。由于链接的、自关闭的 <script> 将破坏所有浏览器,用户只会看到空白页面 - 游戏机、互联网电视、企业 Win7 PC上的 IE 11 、数百万个Java 运行时或数十亿个智能手机。你能在大多数设备上升级大多数语言的大多数 WebView 吗?如果 HTML5 尝试,他们会像 XHTML2 一样失败。
2021-04-04 19:50:27

如果有人好奇,最终的原因是 HTML 最初是 SGML 的一种方言,它是 XML 的怪异哥哥。在 SGML-land 中,元素可以在 DTD 中指定为自闭合(例如 BR、HR、INPUT)、隐式可闭合(例如 P、LI、TD)或显式可闭合(例如 TABLE、DIV、SCRIPT)。当然,XML 没有这个概念。

现代浏览器使用的 tag-soup 解析器是从这种遗留下来的,尽管它们的解析模型不再是纯 SGML。当然,除非您使用 XML mime 类型发送它,否则您精心制作的 XHTML 将被视为编写不当的 SGML 启发的标签汤。这也是为什么...

<p><div>hello</div></p>

...被浏览器解释为:

<p></p><div>hello</div><p></p>

...这是一个可爱的晦涩错误的秘诀,当您尝试针对 DOM 进行编码时,它可能会让您陷入困境。

@MrLister - 有点。“标签汤”描述了 HTML 是如何解析的,而不是它是如何创作的。这是一个术语,用于描述浏览器用来理解 HTML 的不同策略,与严格的 XML 解析形成对比。XML 解析只允许用于 XML mime 类型,但由于那些从未得到广泛使用,浏览器退回到各种“标签汤”方案,即使对于其他有效的文档也是如此。
2021-03-13 19:50:27
@AhmedAeonAxan:P元素不能包含DIV元素(这是无效的 HTML),因此浏览器在开始标记之前隐式关闭P元素(定义为“隐式关闭”)DIV然而,浏览器在这方面的表现往往有所不同(因为它们可以处理任何无效的 HTML)。
2021-03-25 19:50:27
我很好奇。为什么浏览器选择以这种方式解释它?
2021-03-28 19:50:27
@ColeJohnson 不,这不是标签汤;greim 混淆了有效和无效 HTML 之间的边界。当作者不关心规则时,标签汤就是你得到的,因为浏览器使用纠错。</p>另一方面,缺少的结束标记实际上是 HTML 定义的一部分!
2021-03-31 19:50:27
HTML5 实际上标准化了“标签汤”的解析,包括处理无效标记的一致方法。在那之前,浏览器必须自己弄清楚如何处理无效标记,从而导致不一致。当前浏览器中的 HTML 解析器是有史以来编写的最先进的软件之一。速度极快,可以处理几乎任何输入,产生一致的结果。
2021-04-01 19:50:27

Internet Explorer 8 及更早版本不支持 XHTML 解析。即使您使用 XML 声明和/或 XHTML 文档类型,旧的 IE 仍会将文档解析为纯 HTML。在纯 HTML 中,不支持自关闭语法。尾部斜杠只是被忽略,您必须使用显式结束标记。

即使是支持 XHTML 解析的浏览器,例如IE 9 和更高版本,仍会将文档解析为 HTML,除非您使用 XML 内容类型提供文档。但在那种情况下,旧的 IE 根本不会显示文档!

@scunliffe IE9 是第一个完全支持 XHTML 的版本。blogs.msdn.com/b/ie/archive/2010/11/01/...
2021-03-14 19:50:27
“IE 不支持 XHTML 解析。” 在编写本文时对于 IE 版本是正确的,但现在不再正确。
2021-03-22 19:50:27
@EricLaw 你能澄清哪个版本的 IE 解决了这个问题吗?(以及任何特定条件 - 例如需要有效的文档类型)
2021-03-25 19:50:27