HTML/JavaScript 在所有主流浏览器中引用错误?

HTML/JavaScript quoting bug in all major browsers?

假设,您想要在 HTML 页面的 JavaScript 中显示字符串内容为 <!-- Comment --> <script type="text/javascript"></script> 的警报。您可以使用以下代码执行此操作:

<!DOCTYPE html>
<html>
<head>
<title>Quoting</title>
</head>
<body>
<script type="text/javascript">
   alert('<!-- Comment --> <script type="text/javascript"></script\u003E');
</script>
</body>
</html>

这里请注意文本 </script> 部分中引用的 > 字符。这使用 JavaScript Unicode 转义来防止 HTML 解析器将字符串文字的这一部分解释为脚本标记的结尾。上面的代码在 FF、Chrome、IE.

中完美运行

现在尝试将 > 引号也应用到字符串文字中注释的末尾。这应该没有任何改变,因为 XML 注释语法不应在 HTML 中的脚本标记内解释(显然不被解释,因为注释语法显示在警报中):

<!DOCTYPE html>
<html>
<head>
<title>Quoting</title>
</head>
<body>
<script type="text/javascript">
   alert('<!-- Comment --\u003E <script type="text/javascript"></script\u003E');
</script>
</body>
</html>

有趣的是,此代码中断 - 页面加载时未打印警告。该问题至少可以在 FF、Chrome 和 IE 中重现。我是否遗漏了规范中的某些内容,或者是所有主要浏览器的 HTML 解析器中的“与浏览器无关”的错误?

DOM 检查器显示以下内容:

在这种情况下,文档的其余部分似乎被解释为脚本的一部分。

有什么想法吗?

这不是错误。

第一个<将解析器放入Script data less-than sign state then the ! puts it in script data escape start state等等。

用转义序列替换结束 HTML 注释的 > 意味着它不会退出“正在处理注释”状态,直到它到达 HTML 文件.


这是早期 HTML 黑客攻击的历史产物,用于允许内联脚本,而 JS 源代码不显示在不支持 <script> 元素的浏览器的页面上。