Ответ 1
В соответствии с www.w3.org/TR/xhtml1/#h-4.8 раздел CDATA может быть определен как: [no//]
Да. В XHTML они могут. Правильный XHTML, как читается синтаксическим анализатором XML, например, когда вы обслуживаете application/xhtml+xml
в веб-браузере, который не является IE.
Но, вероятно, вы фактически используете text/html
, что означает, что ваш браузер не является "процессором XML", как указано в этом разделе. Это анализатор legacy-HTML4, поэтому вы должны соблюдать рекомендации к приложению C и избегать любых функций XML, которые не работают в HTML4.
В частности, строки <![CDATA[
и ]]>
в блоке <script>
или <style>
не являются особыми для парсера HTML4, потому что в HTML4 эти два элемента являются "элементами CDATA, где разметка не применяется ( за исключением последовательности </
ETAGO, чтобы закончить сам элемент). Таким образом, синтаксический анализатор HTML4 отправит эти строки прямо в механизм CSS или JavaScript.
Поскольку <![CDATA[
недействителен JS, вы получите синтаксическую ошибку JavaScript. (Другие ответы здесь неправильные: не только очень старые браузеры, но и все браузеры HTML4, которые выдадут ошибки для раздела без комментирования CDATA в script.)
Вы используете разметку комментариев //
или /*
, чтобы скрыть содержимое из механизма JavaScript или CSS. Итак:
<script type="text/javascript">//<![CDATA[
alert('a&b');
//]]></script>
(Обратите внимание на ведущий //
, который был опущен в примере кода W3Schools, и этот код кода вообще не работает. Fail. Не доверяйте W3Schools: они не имеют никакого отношения к W3C, и их материал часто мусор.)
Это читается анализатором HTML как:
- Open-tag
script
установление содержимого CDATA до следующего ETAGO - Текст
//<![CDATA[\n alert('a&b');\n//]]>
- ETAGO и тег-тег
script
- → результирующий контент, отправленный движку JavaScript:
//<![CDATA[\nalert('a&b');\n//]]>
Но парсером XML как:
- Open-tag
script
(никаких специальных последствий синтаксического анализа) - Текстовое содержимое
//
- Откройте раздел CDATA, устанавливающий содержимое CDATA до следующей последовательности
]]>
- Текст
\n alert('a&b');\n//
- Закрыть раздел CDATA
- Закрыть тег
script
- → результирующий контент, отправленный движку JavaScript:
//\nalert('a&b');\n//
В то время как процесс синтаксического анализа сильно отличается, JS-движок заканчивается тем же эффективным кодом в каждом случае, так как благодаря //
s разница в комментариях.
Обратите внимание, что это совсем другое дело для старой школы:
<script type="text/javascript"><!--
alert('a&b');
//--></script>
который должен был скрывать контент script/style, чтобы он не записывался на страницу в браузерах, которые не понимали теги <script>
и <style>
. Это не приведет к возникновению ошибки JavaScript/CSS, потому что взломанный был помещен на другой уровень: это синтаксическая особенность самих CSS и JavaScript-языков, для которых <!--
определенно ничего не делает, позволяя этому хаку работать.
Эти браузеры - древняя история; вы абсолютно не должны использовать этот метод сегодня. Особенно в XHTML, поскольку синтаксический анализатор XML возьмет вас под ваше слово, превратив блок script в комментарий XML вместо исполняемого кода.
Я хочу встраивать скрипты или CSS в xHTML без экранирования специальных символов.
Избегайте делать это, и вы будете намного счастливее.
Вам действительно нужны символы <
и &
в <style>
? Нет, почти никогда. Вы действительно нуждаетесь в них в <script>
? Ну... иногда, да, и в этом случае замечательный CDATA-раздел является приемлемым.
Но, честно говоря, руководство по совместимости XHTML C.4 применимо к HTML4, как и к XHTML1: что-то нетривиальное должно быть во внешнем script, и тогда вам не нужно беспокоиться ни о каком из это.