Вопрос

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

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

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

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

<script type="text/javascript">
...code...
</script>
Это было полезно?

Решение

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

Другие советы

Когда браузеры обрабатывают разметку как 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 интерпретирует символы &,<,> в сценарий тег и вызвать ошибку синтаксического анализа 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 во время проверки xhtml.

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top