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>
元素的浏览器的页面上。
假设,您想要在 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>
元素的浏览器的页面上。