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

Нужны ли когда-либо теги CDATA в тегах сценария и если да, то когда?

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

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

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

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

15 ответов

Решение

Раздел 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

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

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

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

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

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

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

HTML

HTML-парсер будет обрабатывать все между <script> а также </script> как часть сценария. Некоторым реализациям даже не нужен правильный закрывающий тег; они останавливают интерпретацию сценария на </ ", что является правильным в соответствии со спецификациями.

Обновление В HTML5 и с текущими браузерами это уже не так.

Итак, в HTML это невозможно:

<script>
var x = '</script>';
alert(x)
</script>

CDATA раздел не имеет никакого эффекта. Вот почему вам нужно написать

var x = '<' + '/script>'; // or
var x = '<\/script>';

или похожие.

Это также относится к файлам XHTML, text/html, (Поскольку IE не поддерживает типы контента XML, это в основном верно.)

XML

В XML применяются другие правила. Обратите внимание, что браузеры (не IE) используют синтаксический анализатор XML, только если документ XHMTL обслуживается с типом содержимого XML.

Для парсера XML script тег не лучше, чем любой другой тег. В частности, узел сценария может содержать нетекстовые дочерние узлы, запускаемые командой " < "; а" & Знак обозначает характер персонажа.

Итак, в XHTML это невозможно:

<script>
if (a<b && c<d) {
    alert('Hooray');
}
</script>

Чтобы обойти это, вы можете обернуть весь сценарий в CDATA раздел. Это говорит парсеру: "В этом разделе не лечить" < " а также " & "как управляющие символы". Чтобы механизм JavaScript не интерпретировал " <![CDATA[ " а также " ]]> отметки, вы можете обернуть их в комментариях.

Если ваш скрипт не содержит < " или же " & "Вам не нужен CDATA раздел в любом случае.

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

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

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

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

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

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

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

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

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

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

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

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

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

Вот объяснение в Википедии

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

Чтобы избежать ошибок XML во время проверки XML.

CDATA говорит браузеру отображать текст как есть, а не отображать его как HTML.

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

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

Рекомендации

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

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

Другие вопросы по тегам