javascript - 为什么自闭合脚本标签不会触发错误?

标签 javascript html xhtml

以下代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>A</title>
    <script type="text/javascript" src="./script.js" />
    <script type="text/javascript">alert("This is skipped.");</script>
</head>
<body>    
</body>
</html>

通过了 W3C 的验证测试,Chrome 不会在此页面上显示任何 Javascript 错误。然而,全文<script type="text/javascript">alert("This is skipped."); Javascript 引擎不会解析它,它只会查找 </script>标签,即使它是自关闭的。但是,文件“script.js”已加载。

在 Chrome、Firefox 和 IE 11 中,这会导致相同的行为。

这是为什么呢?这里到底发生了什么?

最佳答案

您拥有的代码有效,因为您拥有 XHTML 文档类型。在 XHTML 中,任何元素都允许使用自关闭语法(尽管这对大多数元素来说没有什么意义)。

如果您使用 XML 内容类型(例如 Content-Type: application/xhtml+xml)提供文档,那么它也可以在浏览器中工作。

由于您(大概)使用 Content-Type: text/html 提供文档,浏览器会将其解析为 HTML。

  1. 将解析第一个脚本标记(/ 将被忽略或视为无效属性)。
  2. 第二个 script 标签将被 HTML 解析器解析为 JavaScript(因此它将被视为文本)
  3. 将解析第一个脚本结束标记(并从 (1) 开始关闭脚本标记)
  4. 由于第一个脚本标签具有 src 属性,因此外部脚本将被加载并传递给 JS 解析器
  5. 内联“JavaScript”(第二个脚本标记)不会传递给 JS 解析器,因为脚本元素不能有外部 内联脚本(因此您不会得到一个 JS 错误)。不过,它可以作为文本添加到 DOM 中。

请注意,appendix C 禁止对脚本元素使用自关闭语法。因为 HTML 解析器不会给出所需的结果。总而言之,XHTML 比 99% 以上的时间要麻烦得多,因此您应该坚持使用 HTML 而不是 XHTML。

关于javascript - 为什么自闭合脚本标签不会触发错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26076015/

相关文章:

javascript - 混合(图片+视频)类型的灯箱问题

php - 使用两个按钮 "save"和 "save & submit"提交表单?

xhtml 文件中无法识别 HTML5 &lt;header&gt; 标记

javascript - jQuery "Cycle"插件导致内容不居中,我该如何解决?

html - 显示 : inline-block extra margin

javascript - 将样式添加到另一个对象数组中的数组元素

javascript - jQuery 数据表不刷新

javascript - JavaScript 中的 DOM 和 BOM 是什么?

javascript - 如果选中单选按钮,则 jQuery HTML5 必填字段

javascript - css 将阴影切换到文本的背面