无法在CDATA中运行JavaScript

时间:2012-03-06 19:25:34

标签: javascript html cdata

我试图在每个浏览器中运行以下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在控制台中记录错误:未捕获的SyntaxError:意外的令牌&lt;。它似乎在抱怨拳头&lt;在CDATA声明中。 Firefox还会记录“语法错误”

w3schools指出这是使用CDATA http://www.w3schools.com/xml/xml_cdata.asp的方式。本网站上的Other answers表明了这一点。我究竟做错了什么?我尝试使用命名空间和文档类型,但这并没有改变任何东西。

编辑:我添加了XHTML名称空间和doctype,我最初删除了该问题,问题仍然存在。

5 个答案:

答案 0 :(得分:6)

区别在于HTML和XHTML。 W3Schools是正确的,它是XHTML中的有效CDATA构造,但正如您的问题表明您的代码是HTML并且HTML中的<script>内没有CDATA这样的东西,您的示例在解释器看到后立即失败“&LT;”。您可以告诉浏览器它正在查看XHTML,但是处理HTML也可能更安全。为此,您需要在JavaScript注释中隐藏CDATA。 (您也可以考虑确定<script>块中的哪种语言。)

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

事实上,这是万维网联盟(W3C)在XHTML Media Types, A.4. Embedded Style Sheets and Scripts中推荐的方法。

答案 1 :(得分:5)

相关问题When is a CDATA section necessary within a script tag?解释了在XHTML文档中嵌入脚本时建议使用CDATA部分。但是,仅将XHTML doctype设置为测试文档是不够的。 CDATA仍被视为语法错误。

根据this blog post,这是因为内容类型需要与doctype定义匹配。正确的XHTML需要设置以下Content-type标头:

Content-type: application/xhtml+xml

如果未指定并且text/html已发送,则浏览器将恢复为HTML。事实上,如果我将这个标题添加到我的测试用例中,浏览器会开始正确解析CDATA中的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 :(得分:2)

您可能会将其视为XML(XHTML),但这不是浏览器的看法。

您正在为text/html提供服务,这意味着浏览器会将其视为HTML。

需要使用XML mime类型,例如application/xhtml+xml

即。像这样

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

而不喜欢这个

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

检查视图源以查看它是否是同一个文件。检查firebug中的“Net”选项卡(或浏览器的等效选项卡),以查看响应标头中的内容类型。

答案 3 :(得分:1)

此外,您需要注释掉CDATA,以便它在运行时不会抛出解析错误:

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

答案 4 :(得分:0)

1)评论你的CDATA

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

2)添加脚本类型

<script type="text/javascript">