2010-01-31 2 views
6

Что именно нужно избегать в строках javascript. Или, точнее, почемуЗачем мне нужно избегать символа '/' в JavaScript?

var snaphtml = '<script src="http://seadragon.com/embed/lxe.js?width=auto&height=400px"></script>'; 

дает синтаксическую ошибку? Выход из финала <\/script>, похоже, исправляет ошибку синтаксиса, но для меня это не имеет смысла как начинающий javascript.

+2

Подробнее см. Http://mathiasbynens.be/notes/etago. –

ответ

11

Проблема может заключаться в том, что веб-браузер видит последовательность «</script>» и решает, что это конец блока сценария.

Другой способ решить эту проблему в стороне от использования специальной последовательности, как вы сделали это, чтобы разбить его на части в 2 строки, которые сцепленных:

"<" + "/script>" 

поведение вы видите, это не ошибка п часть браузера.

Браузеры не «заглядывают» в блок сценариев, они просто передают содержимое движку сценария. Последовательность «</script>» - это то, как они знают, что они подошли к концу блока, и поскольку браузер не интерпретирует содержимое блока, он не знает, что он находится в контексте литеральной строки в код сценария.

Помните, что браузеры могут поддерживать больше языков сценариев, чем только Javascript, даже если его обычно не видно. Internet Explorer поддерживает VBscript (и я думаю, что любой язык сценариев, который может запускаться хостом Windows-скриптов, но я не уверен в этом). И когда способность иметь блоки скриптов была помещена в браузеры назад, когда никто не мог быть уверен, что Javascript окажется настолько универсальным.

+0

Я видел это в коде Google Analytics. +1 –

+0

Действительно, вы также видите «» много в этой же ситуации. – JAL

+0

Это ошибка? Кажется, это довольно простая вещь для синтаксического анализа. – Tristan

2

HTML-парсер будет интерпретировать конец тега лексемы (ETAGO разделителя </) в строке, в конце текущего тега сценария, давая вам незавершенной строкуSyntaxError.

Есть несколько обходных путей, в том числе использования CDATA блоков, но самый простой способ избежать этого персонажа, или сделать конкатенацию:

var snaphtml = '<script src="...">\x3C/script>'; 

var snaphtml = '<script src="..."><' + '/script>'; 

И, конечно же, вы можете также создать свой script элемент программным и добавить его в голову:

var newScript = document.createElement("script"); 
newScript.src = "..."; 
//... 
+0

Парсер HTML не понимает, что я в строке? Кажется странным. – Tristan

4

Вы на самом деле работает в HTML-спасаясь вопрос: браузер интерпретирует </script> в строке как крупный тег для script элемент, в котором ваш браузер встроен - так в браузере, ваша линия выглядит как он отсутствует близкий одинарные кавычки:

var snaphtml = '<script src="http://seadragon.com/embed/lxe.js?width=auto&height=400px"> 

Чтобы исправить это, как вы нашли, вам просто нужно изменить </script> на все остальное, например <\/script> или \074/script> и т. д.

Единственными символами, которые вам обычно нужно беспокоиться в строке javascript, являются двойная кавычка (если вы цитируете строку с двойной кавычкой), одинарная кавычка (если вы цитируете строку с одной кавычкой), обратную косую черту, возврат каретки (\ r) или строку (\ n).

1

См. Everything you always wanted to know about </, aka. the end-tag open (ETAGO) delimiter для подробного объяснения.TL; DR нет необходимости в сумасшедшие писака, как конкатенация или полукокс буквальных побеги - просто избавиться от нее как таковые:

var snaphtml = '<\/script>'; 

Кроме того, обратите внимание, что это необходимо только для встроенных скриптов.

Смежные вопросы