Когда раздел CDATA необходим в теге скрипта? - PullRequest
872 голосов
/ 16 сентября 2008

Являются ли когда-либо теги CDATA необходимыми в тегах скрипта, и если да, то когда?

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

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

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

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

Ответы [ 15 ]

567 голосов
/ 16 сентября 2008

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

.
231 голосов
/ 16 сентября 2008

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

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

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

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

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

<script>
//<![CDATA[
    ...code...
//]]>
</script>
121 голосов
/ 20 сентября 2009

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.

30 голосов
/ 01 марта 2010

По сути, это позволяет написать документ как в формате 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 голосов
/ 01 марта 2010

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

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

18 голосов
/ 16 сентября 2008

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

17 голосов
/ 01 марта 2010

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

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

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

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

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

10 голосов
/ 01 марта 2010

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

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

9 голосов
/ 16 сентября 2008

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

8 голосов
/ 01 марта 2010

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

...