Ошибка синтаксиса "Unterminated template literal", когда literal содержит тег script
Я использую литералы шаблонов 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, а это не так!
Если я заменю script
на любой другой легальный HTML-тег (и даже недопустимые теги, такие как scripty
), то он работает просто отлично, поэтому я не вижу, как это может быть синтаксическая ошибка или странный случай, когда, я думаю, я набрал один символ (например, backtick), но вместо этого набрал другой, который выглядит почти так.
Я буквально создаю строку (насколько мне известно, во время компиляции) браузер не должен пытаться рассматривать его как HTML или каким-либо образом разбирать его. Так что же дает?
Ответы
Ответ 1
Если вы вставляете </script>
внутри тега скрипта, независимо от того, является ли это строкой в кавычках, апострофах или даже литерале шаблона, он всегда будет закрывать тег скрипта. Вы должны избежать этого, например:
var str='
<script>
<\/script>
'
var pre = document.createElement('pre')
pre.textContent = str
document.body.appendChild(pre)
Тем не менее, если вы используете внешний скрипт <script src="url"></script>
, он должен работать нормально, не убегая.