当文字包含脚本标记时,“未终止的模板文字”语法错误

时间:2016-04-13 19:34:18

标签: javascript html ecmascript-6 script-tag template-literals

我正在使用ES6模板文字在字符串中构造一些HTML,到目前为止它一直运行良好。但是,只要我尝试将文字文本</script>放入我的字符串中,浏览器就会抛出并抛出语法错误:

SyntaxError: Unterminated template literal

这是一个简单的JavaScript示例,它会抛出错误:

var str=`
<script>
</script>
`
var pre = document.createElement('pre')
pre.textContent = str
document.body.appendChild(pre)

请参阅JS Fiddle中的上述代码。

看来正在发生的事情是,它放弃了寻找最终文字引用,而是开始将所有内容视为文字HTML,因此在该点之后的所有JavaScript都被错误地视为HTML,而不是! / p>

如果我将script替换为任何其他合法的HTML标记(甚至是scripty之类的无效标记),那么它的工作正常,所以我看不出这是怎么回事可能是一个语法错误或一个奇怪的情况,我认为我键入了一个字符(例如反引号),而是键入另一个看起来几乎像它。

我实际上是在创建一个字符串(根据我的理解,在编译时),浏览器应该试图将其视为HTML或以任何方式解析它。那是什么给出了什么?

1 个答案:

答案 0 :(得分:31)

如果您在脚本标记中插入</script>,无论它是引号,撇号还是模板文字中的字符串,它都始终关闭脚本标记。你必须逃避它,例如:

var str=`
<script>
<\/script>
`
var pre = document.createElement('pre')
pre.textContent = str
document.body.appendChild(pre)

但是,如果您使用外部脚本<script src="url"></script>,它应该可以正常工作而不会转义。