Не могу запустить JavaScript в CDATA - PullRequest
4 голосов
/ 06 марта 2012

Я пытаюсь запустить следующий HTML в каждом браузере: Opera, FF, IE, Chrome

<!DOCTYPE html  PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
  <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8">
 </head>
 <body>
  <script>
  <![CDATA[
     alert('Hey!');
  ]]>
  </script>
 </body>
</html>

Ни один из них не отображает предупреждение.Chrome регистрирует ошибку в консоли: Uncaught SyntaxError: Неожиданный токен <.Кажется, он жалуется на первый раз в декларации CDATA.Firefox также регистрирует «синтаксическую ошибку» </p>

W3schools указывает, что это способ использовать CDATA http://www.w3schools.com/xml/xml_cdata.asp. Другие ответы на этом сайте предлагают это.Что я делаю неправильно?Я попытался поиграть с пространствами имен и типами документов, но это ничего не изменило.

Редактировать: Я добавил пространство имен XHTML и тип документа, которые я первоначально удалил, и проблема все еще сохраняется.

Ответы [ 5 ]

6 голосов
/ 06 марта 2012

Разница между HTML и XHTML.W3Schools верен, что это допустимая конструкция CDATA в XHTML, но, поскольку ваш вопрос указывает на то, что ваш код - это HTML, а в HTML-коде <script> нет такой вещи, как CDATA, ваш пример завершится неудачно, как только интерпретатор увидит "<».Вы можете сказать браузеру, что он смотрит на XHTML, но, вероятно, безопаснее обрабатывать и HTML.Для этого вам нужно спрятать CDATA внутри комментариев JavaScript.(Вы также можете определить, какой язык находится внутри вашего <code><script> блока.)

<html>
 <head>
 </head>
 <body>
  <script>
  //<![CDATA[
     alert('Hey!');
  //]]>
  </script>
 </body>
</html>

На самом деле это метод, рекомендованный Консорциумом World Wide Web (W3C) в XHTML Media.Типы, А.4.Встроенные таблицы стилей и скрипты .

5 голосов
/ 06 марта 2012

Соответствующий вопрос Когда раздел CDATA необходим в теге сценария? объясняет, что раздел CDATA рекомендуется при встраивании сценариев в документы XHTML. Однако просто установить тип документа XHTML в тестовом документе недостаточно. CDATA все еще обрабатывается как синтаксическая ошибка.

Согласно этой записи в блоге , это связано с тем, что тип контента должен соответствовать определению типа документа. Правильный XHTML должен иметь следующий набор заголовков Content-type:

Content-type: application/xhtml+xml

, если это не указано и вместо этого отправлено text/html, браузеры вернутся в HTML. И действительно, если я добавлю этот заголовок в свой тестовый пример, браузеры начнут правильно анализировать JavaScript внутри CDATA, даже если он не закомментирован.

Это работает для меня (настройка заголовка с помощью PHP):

<?php header("Content-type: application/xhtml+xml"); 
      echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>
<!DOCTYPE html  PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <script><![CDATA[alert('Hey!');]]></script>
  </head>
  <body>
  </body>
 </html>​
2 голосов
/ 06 марта 2012

Вы можете видеть его как XML (XHTML), но браузер его не видит.

Вы предоставляете ему text/html, что означает, что браузер видит его как HTML.

Он должен быть обслужен с типом mime XML, таким как application/xhtml+xml

, т. Е. Вот так

http://www.alohci.net/application/xhtml+xml/starov.htm.ashx

, а не так

http://www.alohci.net/text/html/starov.htm.ashx

Проверьте источник просмотра и убедитесь, что это тот же файл.Проверьте вкладку «Сеть» в Firebug (или эквивалент для вашего браузера), чтобы увидеть тип содержимого в заголовках ответа.

1 голос
/ 06 марта 2012

Кроме того, вам нужно закомментировать CDATA, чтобы он не выдавал ошибку разбора при запуске:

<script>
//<![CDATA[
     alert('Hey!');
//]]>
</script>
0 голосов
/ 06 марта 2012

1) Прокомментируйте свой CDATA

  //<![CDATA[
     alert('Hey!');
  //]]>

2) добавьте тип сценария

<script type="text/javascript">
...