Когда раздел CDATA необходим в теге script?

В тегах script всегда нужны метки CDATA, и если да, когда?

Другими словами, когда и где это:

<script type="text/javascript">
//<![CDATA[
...code...
//]]>
</script>

предпочтительнее:

<script type="text/javascript">
...code...
</script>

Ответы

Ответ 1

Раздел CDATA необходим, если вам нужно, чтобы ваш документ анализировался как XML (например, когда страница XHTML интерпретируется как XML), и вы хотите иметь возможность писать литералы i<10 и a && b вместо i&lt;10 и a &amp;&amp; b, поскольку XHTML будет анализировать код JavaScript как проанализированные символьные данные, а не по умолчанию. Это не проблема со сценариями, которые хранятся во внешних исходных файлах, но для любого встроенного JavaScript в XHTML вы, вероятно, захотите использовать раздел CDATA.

Обратите внимание, что многие страницы XHTML никогда не должны анализироваться как XML, и в этом случае это не будет проблемой.

Для хорошей записи по этому вопросу см. http://javascript.about.com/library/blxhtml.htm

Ответ 2

Когда браузер обрабатывает разметку как XML:

<script>
<![CDATA[
    ...code...
]]>
</script>

Когда браузер обрабатывает разметку как HTML:

<script>
    ...code...
</script>

Когда браузеры обрабатывают разметку как HTML и вы хотите, чтобы ваша разметка XHTML 1.0 (например) проверялась.

<script>
//<![CDATA[
    ...code...
//]]>
</script>

Ответ 3

HTML

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

В 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.

Ответ 4

В основном это разрешить запись документа, который является как XHTML, так и HTML. Проблема в том, что в XHTML анализатор XML будет интерпретировать символы &, <, > в теге script и вызывать ошибку анализа XML. Таким образом, вы можете написать свой JavaScript с объектами, например:

if (a &gt; b) alert('hello world');

Но это непрактично. Большая проблема заключается в том, что если вы читаете страницу в HTML, тег script считается CDATA 'по умолчанию', и такой JavaScript не будет работать. Поэтому, если вы хотите, чтобы одна и та же страница была в порядке, используя синтаксические анализаторы XHTML и HTML, вам нужно заключить тег script в элемент CDATA в XHTML, но НЕ прилагать его в HTML.

Этот трюк обозначает начало элемента CDATA в качестве комментария JavaScript; в HTML парсер JavaScript игнорирует тег CDATA (это комментарий). В XHTML анализатор XML (который запускается перед JavaScript) обнаруживает его и обрабатывает остальные до конца CDATA как CDATA.

Ответ 5

Это вещь X (HT) ML. Когда вы используете символы типа < и > в JavaScript, например. для сравнения двух целых чисел это должно быть проанализировано подобно XML, поэтому они будут отмечать как начало или конец тега.

CDATA означает, что следующие строки (все до ]]> не являются XML и поэтому не должны анализироваться таким образом.

Ответ 6

Не используйте CDATA в HTML4, но вы должны использовать CDATA в XHTML и должны использовать CDATA в XML, если у вас есть unescaped символы типа < и > .

Ответ 7

Чтобы убедиться, что проверка правильности XHTML работает правильно, если на вашей странице встроен JavaScript, а не внешне.

XHTML требует, чтобы ваша страница строго соответствовала требованиям разметки XML. Поскольку JavaScript может содержать символы со специальным значением, вы должны обернуть его в CDATA, чтобы убедиться, что проверка не означает, что он неверен.

С HTML-страницами в Интернете вы можете просто добавить требуемый JavaScript между тегами. Когда вы проверяете HTML на своей веб-странице, содержимое JavaScript считается CDATA (символьные данные), которое поэтому игнорируется валидатором. То же самое не верно, если вы следуете более поздним стандартам XHTML при настройке своей веб-страницы. С XHTML код между тегами script считается PCDATA (анализируемые символьные данные), который поэтому обрабатывается валидатором.

     

Из-за этого вы не можете просто включать JavaScript между тегами script на своей странице, не разбивая свою веб-страницу (по крайней мере, насколько это касается валидатора).

Вы можете узнать подробнее о CDATA здесь и подробнее о XHTML здесь.

Ответ 8

Когда вы собираетесь выполнять строгое соответствие XHTML, вам нужно, чтобы CDATA так меньше, и амперсанды не помечены как недопустимые символы.

Ответ 9

CDATA указывает, что содержимое внутри не является XML.

Вот объяснение wikipedia

Ответ 10

чтобы избежать ошибок xml во время проверки xhtml.

Ответ 11

CDATA сообщает браузеру, чтобы он отображал текст как есть, а не отображал его как HTML.

Ответ 12

CDATA указывает, что содержимое внутри не является XML.

Ответ 13

CDATA необходим на любом диалекте XML, потому что текст в XML node рассматривается как дочерний элемент перед оценкой как JavaScript. Это также является причиной того, что JSLint жалуется на символ < в регулярных выражениях.

Ссылки

Ответ 15

Таким образом, старый браузер не анализирует Javascript-код, и страница не прерывается.

Обратная совместимость. Должен любить это.