2012-03-06 1 views
4

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

<!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 также регистрирует «синтаксическую ошибку»

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

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

+1

XML! = HTML. Вот вопрос, который объясняет это: –

+1

Возможный дубликат [Когда раздел CDATA необходим в теге скрипта?] (Http://stackoverflow.com/questions/66837/when-is-a-cdata-section-necessary- in-script-tag) –

+1

XHTML - это XML. На самом деле весь HTML на моем сервере генерируется XSL-шаблонами, поэтому по определению он является действительным XML. –

ответ

5

Связанный с этим вопрос When is a CDATA section necessary within a script tag? объясняет, что раздел CDATA рекомендуется при встраивании скриптов в документы XHTML. Тем не менее, просто установить тип документа XHTML в тестовый документ недостаточно. CDATA по-прежнему рассматривается как синтаксическая ошибка.

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

Content-type: application/xhtml+xml 

, если это не указано и text/html посылаемых вместо браузеров вернуться к HTML. И действительно, если я добавлю этот заголовок в свой тестовый пример, браузеры начнут правильно разбирать JavaScript внутри CDATA, даже если 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>​ 
+0

Спасибо, это единственное правильное решение. Смешно, даже википедия получила эту синтаксическую ошибку в своих примерах. Http://en.wikipedia.org/wiki/XHTML –

+0

@ Майк, мне интересно узнать, что неправильно в моем ответе. – danorton

1

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

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

Нет, если он делает правильный XHTML. –

+0

Мой выход произведен с помощью XSL-трансформатора. Раздел CDATA добавляется трансформатором, что предложение u невозможно. –

2

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

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

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

т.е. как этот

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

и не нравится

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

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

+0

Спасибо. Смешно, что эквивалент метатега недостаточно. В принципе, если это файл на диске, а не на сервере, у него никогда не будет возможности правильно разобраться. –

+0

Обратите внимание, что если доступ к файлу осуществляется локально (т. Е. Через протокол 'файл:'), применяются разные правила, а браузеры берут начало от расширения файла. Таким образом, файл с расширением .xhtml будет анализироваться как XML. – Alohci

0

1) Комментировать ваш CDATA

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

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

<script type="text/javascript"> 
6

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

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

Это, по сути, метод по World Wide Web Consortium (W3C) рекомендовал в XHTML Media Types, A.4. Embedded Style Sheets and Scripts.

+0

Если он делает правильный XHTML, тег CDATA будет работать, не помещая его в комментарии. (Не думаю, что есть какие-то причины для использования XHTML в настоящее время.) –

+0

Спасибо, я подробно остановился на этом. – danorton

+0

Я удалил все это, чтобы упростить мой пример. Добавление его обратно не решает проблему. Я отредактировал мой вопрос и добавил их. –

 Смежные вопросы

  • Нет связанных вопросов^_^