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

907

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

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

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

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

<script type="text/javascript">
...code...
</script>
штифтик
источник
18
Теперь, когда XHTML по сути мертв, разве это больше не актуально?
allyourcode
80
@allyourcode: что заставляет вас думать, что XHTML мертв? HTML5? Есть XHTML5, чтобы идти вместе с ним :)
Doktor J
4
@DoktorJ AFAIK xHTML был версии 1. Его HTML-эквивалент был версией 4. В xHTML 2.0 были предприняты усилия, направленные на внедрение пространств имен xform, xlink, time и svg в спецификацию, чтобы улучшить те же функции, которые были в HTML 5. добавление - xform / input-validation, time / animation, svg / canvas - но усилия для спецификации xHTML 2 были переориентированы на особенности HTML 5. Это не означает, что xHTML 2 был удален или устарел, но в ближайшем будущем это не планируется.
Михай Станку
14
XHTML не умер в разработке Java Seam / JSF / Facelets.
JoJo
15
@ Михай Станку - это не совсем правильно. Согласно W3C существует синтаксис XML для HTML5 : «Другой синтаксис, который можно использовать для HTML5, - это XML. Этот синтаксис совместим с документами и реализациями XHTML1. Документы, использующие этот синтаксис, должны обслуживаться с типом носителя XML, а элементы должны быть помещенным в пространство имен w3.org/1999/xhtml в соответствии с правилами, установленными спецификациями XML. "
BrainSlugs83

Ответы:

586

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

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

Для хорошей рецензии на эту тему см. Https://web.archive.org/web/20140304083226/http://javascript.about.com/library/blxhtml.htm.

Майкл Ридли
источник
48
Это намного больше, чем просто «проверка». Самые строгие парсеры XML не пройдут по странице, если столкнутся с недопустимым символом. Это больше, чем просто сделать W3C счастливым и стать зеленым вместо красного.
Лорен Сегал
40
Если вы избегаете &и <символы, вам не нужен раздел CDATA; это будет хорошо работать как в HTML, так и в XHTML. Вы можете легко достичь этого, поместив весь существенный код во внешние скрипты и просто используя встроенные скрипты, например, для. инициализировать переменные (экранирование &/ <в \x26/ \x3Cв строковые литералы, если вам нужно).
bobince
23
Как насчет HTML5?
Мэтью Эттли
5
@ Mathew Attle - это хороший вопрос. Задайте большой вопрос в отдельной ветке, чтобы убедиться в том, что ему уделяется необходимое внимание.
Алекс КейСмит
3
@ Лорен: Тогда это все еще полностью о проверке. Степень, в которой пользовательский агент отклоняет недопустимый XML, является ортогональной.
Гонки легкости на орбите
231

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

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

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

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

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

<script>
//<![CDATA[
    ...code...
//]]>
</script>
Shadow2531
источник
12
Точно так же, как и в отношении безопасности кода, лучше окружить ваши CDATA комментариями к блокам, /* ... */потому что в противном случае, если разрывы строк будут удалены, код будет
нарушен
не должно ли "... как XML" в первом разделе быть "... как не интерпретированный текст"? В stackoverflow.com/questions/2784183/what-does-cdata-in-xml-mean мы видим «... эти строки содержат данные, которые могут быть интерпретированы как разметка XML, но не должны быть».
Мэтт Уилки
@mattwilkie, что я имею в виду под «как XML», так это «когда браузеры используют свой синтаксический анализатор XML (в отличие от синтаксического анализатора HTML) для анализа разметки, поскольку документ был отправлен с использованием mime-типа на основе XML или файл, содержащий разметку, имеет расширение файла на основе XML ".
Shadow2531
127

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

user123444555621
источник
2
Утверждение «раздел CDATA не имеет никакого эффекта» не относится к (предложенному) HTML5, который распознает конструкцию. w3.org/TR/html5/syntax.html#cdata-sections
Данортон
3
@danorton Интересно. Я думаю, что это довольно уродливый микс. Тем не менее, не влияет на содержание скрипта.
user123444555621
2
Не знал, что любые </ внутри скрипта теги это плохо.
Салман А
3
@SalmanA Это одна из странностей HTML, которая официально называется ETAGO . Узнайте больше: mathiasbynens.be/notes/etago (хотя в статье говорится, что ни один браузер никогда не реализовывал эту функцию, я уверен, что это
доставило
1
На самом деле я столкнулся с проблемами проверки - <script>var b = "<b>bold</b>";</script>не удается проверить, но после прочтения вашего ответа и изменения на <script>var b = "<b>bold<\/b>";</script>исправленный.
Салман А
30

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

Ондра
источник
24

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

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

Franz
источник
18

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

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

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

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

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

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

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

LBushkin
источник
10

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

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

Алекс Бердсли
источник
9

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

Крис Шаффер
источник
8

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

gehsekky
источник
8

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

Ikaso
источник
6

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

Джим
источник
5

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

Ссылки

Пол Суатте
источник
2

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

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

Тайлер Картер
источник