Когда в теге сценария необходим раздел CDATA?
-
09-06-2019 - |
Вопрос
Нужны ли теги CDATA в тегах сценариев, и если да, то когда?
Другими словами, когда и где это:
<script type="text/javascript">
//<![CDATA[
...code...
//]]>
</script>
предпочтительнее этого:
<script type="text/javascript">
...code...
</script>
Решение
Раздел CDATA необходим, если вам нужно, чтобы ваш документ анализировался как XML (например,когда страница XHTML интерпретируется как XML) и вы хотите иметь возможность писать буквально i<10
и a && b
вместо i<10
и a && 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 > 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 жалуется о <
символ в регулярных выражениях.
Рекомендации
Когда вы хотите, чтобы он подтвердил (в XML/XHTML – спасибо, Лорен Сигал).
Таким образом, старый браузер не анализирует код Javascript, и страница не ломается.
Обратная совместимость.Должно понравиться.