为何自闭合脚本元素不起作用?

为何自闭合脚本元素不起作用?

技术背景

在网页开发中,HTML 和 XHTML 是常用的标记语言。自闭合标签在 XML 中是一种常见的语法,例如 <br/> 。然而,当尝试使用自闭合的脚本元素 <script /> 时,往往会遇到问题。这涉及到 HTML、XHTML 以及浏览器解析的历史和规范。

实现步骤及原理分析

HTML 4

HTML 4 基于 SGML(标准通用标记语言)。SGML 有一些短标签,但 HTML 并未重新定义类似 XML 自闭合标签的形式。在 HTML 4 中,<SCRIPT/> 理论上应表示 <SCRIPT>> ,这与 XHTML 不兼容,会破坏许多网站,所以实际上没人实现短标签,规范也不建议使用。而且 <script> 的结束标签不是被禁止的,“自结束”标签在 HTML 4 中是一种 hack,没有实际意义。

HTML 5

HTML 5 有五种类型的标签,只有“void”和“foreign”标签允许自闭合。<script> 既不是 void 标签(它可能有内容),也不是 foreign 标签(如 MathML 或 SVG),所以不能自闭合。HTML 5 旨在与 HTML 4 和 XHTML 1 的实现向后兼容,自闭合的 <script> 在不同浏览器实现中存在差异,为了保持兼容性,这个特性被拒绝。

XHTML 1 / XHTML 5

当真正以 XHTML 形式提供服务时,<script/> 是真正闭合的。但规范说 XHTML 文档可以标记为 text/html ,然而由于历史原因,IE 6 等旧浏览器不支持正确的 XHTML MIME 类型,导致大家都使用 text/html 来提供 XHTML。同时,内容嗅探存在问题,W3C 也不希望 XHTML 被嗅探,最终 Firefox 等浏览器遵循规范,仅指定文档类型不会触发 XML 解析。

核心代码示例及解析

错误示例

1
<script src="example.js" />

在普通 HTML 中,这种自闭合写法不会按预期工作。浏览器可能会将其视为 <script src="example.js" /= "/" > ,即把斜杠当作一个空属性,脚本不会正确加载。

正确示例

1
<script src="example.js"></script>

这种显式的开始和结束标签的写法是符合 HTML 和 XHTML 规范的,能确保脚本正确加载和执行。

最佳实践

  • 遵循规范:在 HTML 中,使用显式的开始和结束标签 <script></script>
  • 注意 MIME 类型:如果要使用 XHTML 的自闭合语法,确保服务器发送正确的 XML MIME 类型,如 application/xhtml+xml ,但要考虑旧浏览器的兼容性。
  • 测试兼容性:在不同浏览器和版本中测试代码,确保脚本正常工作。

常见问题

旧浏览器不支持 XHTML

IE 8 及更早版本不支持 XHTML 解析,即使使用 XML 声明和 XHTML 文档类型,仍然会将文档解析为普通 HTML。解决方法是使用 text/html ,并遵循 HTML 的标签规则。

内容嗅探问题

内容嗅探可能导致安全问题,并且不同浏览器的行为不一致。建议遵循规范,通过 Content-Type 来确定文档类型。

自闭合标签被误解

开发者可能习惯在其他标签中使用自闭合语法,错误地应用到 <script> 标签上。要明确 <script> 标签的规范,避免使用自闭合语法。


为何自闭合脚本元素不起作用?
https://119291.xyz/posts/why-dont-self-closing-script-elements-work/
作者
ww
发布于
2025年6月3日
许可协议