Нужны ли теги CDATA в тегах скриптов, и если да, то когда?
Другими словами, когда и где это:
<script type = "text/javascript">
//<![CDATA[
...code...
//]]>
</script>
предпочтительнее этого:
<script type = "text/javascript">
...code...
</script>
@allyourcode: почему вы думаете, что XHTML мертв? HTML5? Вместе с этим есть XHTML5 :)
@DoktorJ AFAIK xHTML был в версии 1. Его эквивалентом в HTML была версия 4. В xHTML 2.0 были сосредоточены усилия, направленные на включение пространств имен xform, xlink, time и svg в спецификацию для улучшения тех же функций, что и в HTML 5. добавление - xform / input-validation, time / animations, svg / canvas - но усилия по спецификации xHTML 2 были переориентированы на функции HTML 5. Это не означает, что xHTML 2 был исключен или стал устаревшим, но это не планируется в ближайшем будущем.
XHTML не умер в разработке Java Seam / JSF / Facelets.
@Mihai Stancu - это не совсем правильно. Согласно W3C существует Синтаксис XML для HTML5: «Другой синтаксис, который можно использовать для HTML5, - это XML. Этот синтаксис совместим с документами и реализациями XHTML1. Документы, использующие этот синтаксис, должны обслуживаться с типом мультимедиа XML, а элементы должны быть помещены в пространстве имен w3.org/1999/xhtml в соответствии с правилами, установленными спецификациями XML ".
@allyourcode: Mate XHTML сейчас является предпочтительным, и он не мертв. HTML должен быть мертв, за исключением того, что беспорядочные кодеры не смогут работать.
@allyourcode мои военные заказчики в Великобритании только что перешли с IE6 на IE8 после пяти лет криков на них. Если XHTML мертв, мне нужно большое весло, чтобы выбраться из этого ручья. Автообновляющиеся браузеры не используются многими крупными корпорациями (к сожалению).
@EvilDr Но IE8 еще не поддерживает XHTML. Когда появится IE9, вы сможете использовать XHTML! Да!
@DoktorJ Я сомневаюсь, что XHTML5 станет популярным. ИМО, XHTML изжил себя.
SVG жив и здоров и требует объявлений CDATA для любого внутреннего ecmascript, который включает <и &.
Чтобы доказать, что XHTML не мертв, посетите этот сайт. Это настоящий настоящий XHTML-сайт (!)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Когда вы хотите, чтобы это подтвердилось (в XML / XHTML - спасибо, Лорен Сигал).
Когда вы стремитесь к строгому соответствию XHTML, вам понадобится CDATA, чтобы меньше чем и амперсанды не помечались как недопустимые символы.
Раздел 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 не пройдут страницу, если обнаружат недопустимый символ. Это больше, чем просто сделать W3C счастливым и получить зеленый цвет вместо красного.
Если вы избегаете символов & и <, вам не нужен раздел CDATA; он будет отлично работать как в HTML, так и в XHTML. Вы можете легко добиться этого, поместив весь значимый код во внешние сценарии и просто используя встроенные сценарии, например. инициализировать переменные (экранирование от & / < до \x26 / \x3C в строковых литералах, если вам нужно).
А как насчет HTML5?
@ Мэтью Эттл - это хороший вопрос. Хороший вопрос - задать его в отдельной беседе, чтобы убедиться, что он получит необходимое внимание.
@Loren: Значит, дело все еще в валидации. Степень, в которой пользовательский агент отклоняет недопустимый XML, ортогональна.
@chief: неверно, html5 содержит диалект xhtml, включенный за счет обслуживания его с типом mime xhtml (для локальных файлов это окончание файла .xhtml)
что вы имеете в виду под анализируемыми данными и символьными данными?
@ Мэтью Эттли: Согласно W3C, есть синтаксис XML для HTML5. При использовании синтаксиса XML случай будет таким же.
Символьные данные @CoffeeAddict представляют собой обычный текст. Что-то вроде "</script> используется как есть. Анализируемые данные анализируются как HTML (или XML): "</script> интерпретируется как ", а затем синтаксический анализатор прекращает синтаксический анализ, поскольку обнаруживает конечный тег.
@MathewAttlee в этом нет необходимости для HTML5.
Многие комментарии о том, что XHTML мертв, вводят в заблуждение, потому что существуют различные другие широко используемые XML-форматы, некоторые из которых де-факто являются частями HTML5. Например, вам все еще нужен CDATA для элементов скрипта внутри SVG, потому что SVG - это XML.
Из заархивированной ссылки на about.com: "<!-- // hide from really old browsers that noone uses anymore"; ^ D
нет использует CDATA в HTML4, но вы должен используете CDATA в XHTML, а должен используете CDATA в XML, если у вас есть неэкранированные символы, такие как <и>.
CDATA недействителен в HTML4. Проще говоря, это не часть грамматики. CDATA - это синтаксис XML, а XHTML - это подмножество XML. Поэтому его следует использовать только внутри XML (и его подмножеств). С другой стороны, HTML - это не XML.
Когда браузеры обрабатывают разметку как XML:
<script>
<![CDATA[
...code...
]]>
</script>
Когда браузеры обрабатывают разметку как HTML:
<script>
...code...
</script>
Когда браузеры обрабатывают разметку как HTML и вы хотите, чтобы разметка XHTML 1.0 (например) проверялась.
<script>
//<![CDATA[
...code...
//]]>
</script>
Так же, как вопрос безопасности кода, лучше окружить ваши CDATA комментариями блока /* ... */, потому что в противном случае, если разрывы строк будут удалены, код сломается.
не должно ли "... как XML" в первом разделе быть "... как неинтерпретируемый текст"? В stackoverflow.com/questions/2784183/what-does-cdata-in-xml-m ean мы видим: «... эти строки включают данные, которые мог интерпретировать как разметку XML, но не должны».
@mattwilkie, Под «как XML» я подразумеваю: «Когда браузеры используют свой анализатор XML (в отличие от анализатора HTML) для анализа разметки, потому что документ был отправлен с типом mime на основе XML или файл, содержащий разметку, имеет расширение файла на основе XML ".
Анализатор HTML будет рассматривать все, что находится между <script> и </script>, как часть сценария. Некоторым реализациям даже не нужен правильный закрывающий тег; они останавливают интерпретацию сценария на ".</", что правильно согласно спецификации
Update In HTML5, and with current browsers, that is not the case anymore.
Итак, в HTML это возможно нет:
<script>
var x = '</script>';
alert(x)
</script>
Раздел CDATA имеет никакого эффекта. Вот почему вам нужно написать
var x = '<' + '/script>'; // or
var x = '</script>';
или похожие.
Это также относится к файлам XHTML, обслуживаемым как text/html. (Поскольку IE не поддерживает типы содержимого XML, это в основном верно.)
В XML применяются другие правила. Обратите внимание, что браузеры (не IE) используют синтаксический анализатор XML, только если документ XHMTL обслуживается с типом содержимого XML.
Для синтаксического анализатора XML тег script ничем не лучше любого другого тега. В частности, узел сценария может содержать нетекстовые дочерние узлы, запускаемые «<»; а знак «&» обозначает символьный объект.
Итак, в XHTML это возможно нет:
<script>
if (a<b && c<d) {
alert('Hooray');
}
</script>
Чтобы обойти это, вы можете обернуть весь скрипт в раздел CDATA. Это сообщает синтаксическому анализатору: «В этом разделе не обрабатывайте "<" и "&" как управляющие символы». Чтобы механизм JavaScript не интерпретировал метки «<![CDATA[» и «]]>», вы можете заключить их в комментарии.
Если ваш сценарий не содержит «<» или «&», вам в любом случае не нужен раздел CDATA.
Утверждение «Секция CDATA вообще не действует» неверно для (предлагаемого) HTML5, который распознает конструкцию. w3.org/TR/html5/syntax.html#cdata-sections
@danorton Интересно. Я думаю, что это довольно уродливая смесь. Однако по-прежнему не влияет на содержимое сценария.
Вау, я думал, что иметь сценарии как PCDATA в XHTML было громоздко и бессмысленно; не думал о том, что произойдет, если использовать "</script>", если это будет CDATA, как в HTML4. Обожаю XHTML :)
Не знал, что любой</ внутри тегов скрипта - это плохо.
@SalmanA Это одна из странностей HTML и официально называется ЭТАГО. Подробнее: mathiasbynens.be/notes/etago (хотя в статье говорится, что ни один браузер никогда не реализовывал эту функцию, я почти уверен, что это вызвало у меня проблемы. Может быть, в каком-то другом инструменте)
На самом деле я столкнулся с проблемами проверки - <script>var b = "<b>bold</b>";</script> не проходит проверку, но после прочтения вашего ответа и перехода на <script>var b = "<b>bold</b>";</script> он исправлен.
чтобы избежать ошибок xml во время проверки xhtml.
Таким образом, старый браузер не анализирует код Javascript, и страница не ломается.
Обратная совместимость. Должен любить это.
CDATA сообщает браузеру отображать текст как есть, а не отображать его как HTML.
Это X (HT) ML. Когда вы используете такие символы, как < и > в JavaScript, например для сравнения двух целых чисел это должно быть проанализировано как XML, поэтому они будут отмечены как начало или конец тега.
CDATA означает, что следующие строки (все до ]]> не являются XML и, следовательно, не должны анализироваться таким образом.
CDATA указывает, что содержимое не является XML.
Вот объяснение по википедия
Это необходимо для того, чтобы проверка XHTML работала правильно, если на вашей странице есть встроенный JavaScript, а не внешние ссылки.
XHTML требует, чтобы ваша страница строго соответствовала требованиям разметки XML. Поскольку JavaScript может содержать символы со специальным значением, вы должны заключить его в CDATA, чтобы проверка не пометила его как искаженный.
With HTML pages on the web you can just include the required JavaScript between and tags. When you validate the HTML on your web page the JavaScript content is considered to be CDATA (character data) that is therefore ignored by the validator. The same is not true if you follow the more recent XHTML standards in setting up your web page. With XHTML the code between the script tags is considered to be PCDATA (parsed character data) which is therefore processed by the validator.
Because of this, you can't just include JavaScript between the script tags on your page without 'breaking' your web page (at least as far as the validator is concerned).
Вы можете изучить подробнее о CDATA здесь и подробнее о XHTML здесь.
В основном это позволяет писать документ, который является одновременно 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.
CDATA необходим на любом диалекте XML, потому что текст в узле XML обрабатывается как дочерний элемент до того, как он будет оценен как JavaScript. Это также причина того, почему JSLint жалуется о символе < в регулярных выражениях.
Рекомендации
CDATA указывает, что содержимое не является XML.
Теперь, когда XHTML практически мертв, разве это больше не актуально?