以下代码:
<!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。
- 将解析第一个脚本标记(
/
将被忽略或视为无效属性)。 - 第二个 script 标签将被 HTML 解析器解析为 JavaScript(因此它将被视为文本)
- 将解析第一个脚本结束标记(并从 (1) 开始关闭脚本标记)
- 由于第一个脚本标签具有 src 属性,因此外部脚本将被加载并传递给 JS 解析器
- 内联“JavaScript”(第二个脚本标记)不会传递给 JS 解析器,因为脚本元素不能有外部 和 内联脚本(因此您不会得到一个 JS 错误)。不过,它可以作为文本添加到 DOM 中。
请注意,appendix C 禁止对脚本元素使用自关闭语法。因为 HTML 解析器不会给出所需的结果。总而言之,XHTML 比 99% 以上的时间要麻烦得多,因此您应该坚持使用 HTML 而不是 XHTML。
关于javascript - 为什么自闭合脚本标签不会触发错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26076015/