В тегах script всегда нужны метки CDATA, и если да, когда?
Другими словами, когда и где это:
<script type="text/javascript">
//<![CDATA[
...code...
//]]>
</script>
предпочтительнее:
<script type="text/javascript">
...code...
</script>
Раздел CDATA необходим, если вам нужно, чтобы ваш документ анализировался как XML (например, когда страница XHTML интерпретируется как XML), и вы хотите иметь возможность писать литералы i<10
и a && b
вместо i<10
и a && b
, поскольку XHTML будет анализировать код JavaScript как проанализированные символьные данные, а не по умолчанию. Это не проблема со сценариями, которые хранятся во внешних исходных файлах, но для любого встроенного JavaScript в XHTML вы, вероятно, захотите использовать раздел CDATA.
Обратите внимание, что многие страницы XHTML никогда не должны анализироваться как XML, и в этом случае это не будет проблемой.
Для хорошей записи по этому вопросу см. http://javascript.about.com/library/blxhtml.htm
&
и <
, вам не нужен раздел CDATA; это будет хорошо работать как в HTML, так и в XHTML. Вы можете легко достичь этого, поместив весь существенный код во внешние скрипты и просто используя встроенные скрипты, например, для. инициализирует переменные (спасаясь &
/ <
к \x26
/ \x3C
в строковых литералов , если вам нужно).
Когда браузер обрабатывает разметку как XML:
<script>
<![CDATA[
...code...
]]>
</script>
Когда браузер обрабатывает разметку как HTML:
<script>
...code...
</script>
Когда браузеры обрабатывают разметку как HTML и вы хотите, чтобы ваша разметка XHTML 1.0 (например) проверялась.
<script>
//<![CDATA[
...code...
//]]>
</script>
/* ... */
потому что в противном случае, если разрывы строк будут удалены, код будет нарушен
HTML-парсер будет обрабатывать все между <script>
и </script>
как часть script. Некоторым реализациям даже не нужен правильный закрывающий тег; они останавливают интерпретацию script на ".</
", что верно в соответствии с спецификациями
Обновить В HTML5 и с текущими браузерами это уже не так.
Итак, в HTML это невозможно:
<script>
var x = '</script>';
alert(x)
</script>
A CDATA
имеет никакого эффекта вообще. Вот почему вам нужно написать
var x = '<' + '/script>'; // or
var x = '<\/script>';
или аналогичный.
Это также относится к файлам XHTML, которые используются как text/html
. (Так как IE не поддерживает типы содержимого XML, это в основном верно.)
В XML применяются разные правила. Обратите внимание, что (не IE) браузеры используют только синтаксический анализатор XML, если документ XHMTL обслуживается с типом содержимого XML.
В парсер XML тег script
не лучше, чем любой другой тег. В частности, script node может содержать нетекстовые дочерние узлы, вызванные "<
"; а знак "&
" обозначает объект символа.
Итак, в XHTML это невозможно:
<script>
if (a<b && c<d) {
alert('Hooray');
}
</script>
Чтобы обойти это, вы можете обернуть весь script в разделе CDATA
. Это говорит синтаксическому анализатору: "В этом разделе не обрабатывают" <
"и" &
"в качестве управляющих символов. ' Чтобы механизм JavaScript не интерпретировал метки" <![CDATA[
"и" ]]>
", вы можете обернуть их комментариями.
Если ваш script не содержит никаких "<
" или "&
", вам все равно не нужен раздел CDATA
.
В основном это разрешить запись документа, который является как XHTML, так и HTML. Проблема в том, что в XHTML анализатор XML будет интерпретировать символы &, <, > в теге script и вызывать ошибку анализа XML. Таким образом, вы можете написать свой JavaScript с объектами, например:
if (a > b) alert('hello world');
Но это непрактично. Большая проблема заключается в том, что если вы читаете страницу в HTML, тег script считается CDATA 'по умолчанию', и такой JavaScript не будет работать. Поэтому, если вы хотите, чтобы одна и та же страница была в порядке, используя синтаксические анализаторы XHTML и HTML, вам нужно заключить тег script в элемент CDATA в XHTML, но НЕ прилагать его в HTML.
Этот трюк обозначает начало элемента CDATA в качестве комментария JavaScript; в HTML парсер JavaScript игнорирует тег CDATA (это комментарий). В XHTML анализатор XML (который запускается перед JavaScript) обнаруживает его и обрабатывает остальные до конца CDATA как CDATA.
Это вещь X (HT) ML. Когда вы используете символы типа <
и >
в JavaScript, например. для сравнения двух целых чисел это должно быть проанализировано подобно XML, поэтому они будут отмечать как начало или конец тега.
CDATA означает, что следующие строки (все до ]]>
не являются XML и поэтому не должны анализироваться таким образом.
Чтобы убедиться, что проверка правильности XHTML работает правильно, если на вашей странице встроен JavaScript, а не внешне.
XHTML требует, чтобы ваша страница строго соответствовала требованиям разметки XML. Поскольку JavaScript может содержать символы со специальным значением, вы должны обернуть его в CDATA, чтобы убедиться, что проверка не означает, что он неверен.
С HTML-страницами в Интернете вы можете просто добавить требуемый JavaScript между тегами. Когда вы проверяете HTML на своей веб-странице, содержимое JavaScript считается CDATA (символьные данные), которое поэтому игнорируется валидатором. То же самое не верно, если вы следуете более поздним стандартам XHTML при настройке своей веб-страницы. С XHTML код между тегами script считается PCDATA (анализируемые символьные данные), который поэтому обрабатывается валидатором.
Из-за этого вы не можете просто включать JavaScript между тегами script на своей странице, не разбивая свою веб-страницу (по крайней мере, насколько это касается валидатора).
Вы можете узнать подробнее о CDATA здесь и подробнее о XHTML здесь.
Не используйте CDATA в HTML4, но вы должны использовать CDATA в XHTML и должны использовать CDATA в XML, если у вас есть unescaped символы типа < и > .
CDATA указывает, что содержимое внутри не является XML.
Вот объяснение wikipedia
Когда вы собираетесь выполнять строгое соответствие XHTML, вам нужно, чтобы CDATA так меньше, и амперсанды не помечены как недопустимые символы.
CDATA сообщает браузеру, чтобы он отображал текст как есть, а не отображал его как HTML.
чтобы избежать ошибок xml во время проверки xhtml.
CDATA указывает, что содержимое внутри не является XML.
CDATA необходим на любом диалекте XML, потому что текст в XML node рассматривается как дочерний элемент перед оценкой как JavaScript. Это также является причиной того, что JSLint жалуется на символ <
в регулярных выражениях.
Ссылки
Таким образом, старый браузер не анализирует Javascript-код, и страница не прерывается.
Обратная совместимость. Должен любить это.
Когда вы хотите, чтобы он проверял (в XML/XHTML - спасибо, Loren Segal).