Когда в теге скрипта необходим раздел 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<10
а также a && 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 > 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, поэтому меньше чем и амперсанды не помечаются как недопустимые символы.
CDATA говорит браузеру отображать текст как есть, а не отображать его как HTML.
CDATA необходим в любом диалекте XML, потому что текст в узле XML обрабатывается как дочерний элемент, прежде чем будет оцениваться как JavaScript. Это также причина, почему JSLint жалуется на <
символ в регулярных выражениях.
Рекомендации
Таким образом, старый браузер не анализирует код Javascript, и страница не разрывается.
Обратная совместимость. Должен любить это.
Когда вы хотите его проверить (в XML/XHTML - спасибо, Loren Segal).