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

837

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

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

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

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

<script type="text/javascript">
...code...
</script>
  • 17
    Теперь, когда XHTML по сути мертв, это уже не актуальная проблема?
  • 79
    @allyourcode: что заставляет вас думать, что XHTML мертв? HTML5? Там XHTML5, чтобы идти вместе с ним :)
Показать ещё 7 комментариев
Теги:
xhtml
cdata

15 ответов

524
Лучший ответ

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

  • 48
    Это намного больше, чем просто «проверка». Самые строгие парсеры XML не пройдут по странице, если столкнутся с недопустимым символом. Это больше, чем просто сделать W3C счастливым и стать зеленым вместо красного.
  • 40
    Если вы избегаете символов & и < , вам не нужен раздел CDATA; это будет хорошо работать как в HTML, так и в XHTML. Вы можете легко достичь этого, поместив весь существенный код во внешние скрипты и просто используя встроенные скрипты, например, для. инициализирует переменные (спасаясь & / < к \x26 / \x3C в строковых литералов , если вам нужно).
Показать ещё 10 комментариев
213

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

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

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

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

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

<script>
//<![CDATA[
    ...code...
//]]>
</script>
  • 22
    +1 за краткость с вариантами использования.
  • 10
    Так же, как и в отношении безопасности кода, лучше окружить ваши CDATA комментариями к блоку /* ... */ потому что в противном случае, если разрывы строк будут удалены, код будет нарушен
Показать ещё 3 комментария
112

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.

  • 2
    Утверждение «раздел CDATA не имеет никакого эффекта» не относится к (предложенному) HTML5, который распознает конструкцию. w3.org/TR/html5/syntax.html#cdata-sections
  • 2
    @danorton Интересно. Я думаю, что это довольно уродливый микс. Тем не менее, не влияет на содержание скрипта.
Показать ещё 6 комментариев
29

В основном это разрешить запись документа, который является как 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.

23

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

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

16

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

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

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

     

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

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

16

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

  • 2
    Почему не в HTML4?
  • 11
    CDATA недействителен в HTML4. Проще говоря, это не часть грамматики. CDATA - это синтаксис XML, а XHTML - это подмножество XML. Поэтому его следует использовать только внутри XML (и его подмножеств). HTML, с другой стороны, не является XML.
9

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

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

9

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

8

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

8

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

6

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

5

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

Ссылки

2

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

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

2

Ещё вопросы

Сообщество Overcoder
Наверх
Меню