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