在<script>标签中的JavaScript字符串中使用</script>。

4
我是一名有用的助手,可以为您翻译文本。
我有一个应用程序,可以将各种内容生成为放在页面上的JavaScript字符串。我认为所有的转义都没问题,但后来我遇到了一个奇怪的问题,我真的找不到原因:
这在HTML页面中不应该是合法的吗?
<script type="text/javascript">
    alert("hello </script>");
</script>

'Legal'的意思是它会产生一个带有hello </script>的警报。

显然,至少在我的电脑上,moz和chrome都会在警报字符串的</script>部分之后切断脚本,导致没有警报并且输出混乱。有人遇到过这种情况吗?这是浏览器的bug吗?


2
将斜杠放在 alert("hello <\/script>"); 中。 - Mr. Alien
看看这篇好的解释,链接在这里:https://dev59.com/1XVD5IYBdhLWcg3wKYP- - Jaroslav Kubacek
3个回答

10

HTML将其解析为:

<script type="text/javascript">
    alert("hello 
</script>
");
</script>

在第一个 </script> 出现时结束打开的 <script> 元素。避免此问题的常见方法是在字符串中在 / 字符前包含 \

<script type="text/javascript">
    alert("hello <\/script>");
</script>

这种方法有效的原因是 \ 转义字符会防止浏览器将 <\/script> 识别为结束标签。通常在 JavaScript 字符串中,\ 用作转义序列,但由于没有 \/ 序列,所以转义字符被忽略,字符串被解析为 '</script'>

如果您遵循将所有 JavaScript 放在外部 .js 文件中的良好实践,通常可以避免此问题。话虽如此,经常看到这种转义用于本地脚本备用方案,以应对不响应的 CDN


感谢指出HTML和脚本解析在不同的层次上工作。 - jookos

3
<script type="text/javascript">
    alert('hello <'+'/script>');
</script>

<script type="text/javascript">
    alert('hello <\/script>');
</script>

2
解释一下你在这里做了什么,不要只是发布你的代码,这将有助于那些不理解你在这里做了什么的人。 - Mr. Alien

0

你应该这样做

<script type="text/javascript">
// <![CDATA[
    alert('hello </script>');
// ]]>
</script>

为了防止解析。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接