在<script>标记</script>中的JavaScript字符串中

时间:2014-03-18 19:10:41

标签: javascript html

我有一个应用程序可以在页面上放置的JavaScript字符串中生成各种各样的东西。我以为所有逃脱都没问题,但后来我遇到了一个奇怪的问题,我无法找到理由:

这不应该在HTML页面中合法:

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

&#39;法律&#39;意味着它会产生hello </script>的警报。

显然,我的盒子上的moz和chrome都会在警报字符串的</script>部分之后关闭脚本,不会产生警报和混乱的输出。有没有人碰到这个,这是一个浏览器错误吗?

3 个答案:

答案 0 :(得分:6)

HTML将其解析为:

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

第一次出现</script>关闭打开的<script>元素。避免此问题的常见方法是在字符串中的\字符前加/

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

这是有效的,因为\转义字符会阻止浏览器将<\/script>识别为结束标记。通常\用作JavaScript字符串中的转义序列,但由于没有\/序列,因此忽略转义字符,字符串的计算结果为'</script'>

如果您遵循将所有javascript保存在外部.js文件中的良好做法,通常可以避免此问题。也就是说,看到用于local script fallbacks for unresponsive CDNs的这种转义很常见。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

你应该这样做

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

防止解析。