2012-03-06 49 views
4

运行JavaScript我试图运行在每个浏览器下面的HTML:歌剧,FF,IE,Chrome的不能在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在控制台中记录错误:未捕获的SyntaxError:意外的令牌<。它似乎在抱怨CDATA声明中的拳头<。火狐还记录“语法错误”

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

编辑:我添加XHTML名字空间和文档类型,那我当初删除,问题仍然存在。

+1

XML!= HTML。下面是一个解释它的问题: – 2012-03-06 19:26:06

+1

可能的重复[When is a CDATA section within a script tag?](http://stackoverflow.com/questions/66837/when-is-a-cdata-section-necessary-脚本内标签) – 2012-03-06 19:27:53

+1

XHTML是XML。事实上,我服务器上的所有HTML都是由XSL模板生成的,因此根据定义它是有效的XML。 – 2012-03-06 19:28:54

回答

5

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

this blog post,这是因为它的内容类型需要的文档类型定义相匹配。正确的XHTML需要具备以下Content-type头设置:如果未指定,text/html发送相反,浏览器将恢复到HTML

Content-type: application/xhtml+xml 

。事实上,如果我将这个头文件添加到我的测试用例中,即使CDATA没有被注释掉,浏览器也可以正确地解析CDATA中的JavaScript。

这对我的作品(设置使用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 – 2012-03-06 20:57:08

+0

@Mike,我很想知道我的答案中有什么不正确。 – danorton 2012-03-06 21:02:21

1

此外,您还需要注释掉CDATA,所以它不会抛出一个分析错误时,它的运行:

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

如果他使XHTML正确,则不是。 – 2012-03-06 19:59:48

+0

我的输出是由XSL变压器产生的。 CDATA部分是由变压器添加的,你建议是不可能的。 – 2012-03-06 20:51:23

2

您可能会看到它作为XML(XHTML),但是这就是浏览器不如何看待它。

你为它服务一个text/html这意味着浏览器将其视为HTML。

它需要与作为application/xhtml+xml

即这样

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

而不是XML MIME类型,例如提供服务喜欢这个

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

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

+0

谢谢。有趣的是,元标签相当于是不够的。基本上,如果这是一个磁盘上的文件而不是服务器上的文件,它从来没有被正确解析的机会。 – 2012-03-06 21:04:52

+0

请注意,如果文件是在本地访问的(即通过'file:'协议),则适用不同的规则,浏览器从文件扩展名开始。所以具有.xhtml扩展名的文件将被解析为XML。 – Alohci 2012-03-07 00:51:00

0

1)评论你的CDATA

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

2)添加脚本类型

<script type="text/javascript"> 
6

不同的是HTML和XHTML之间。 W3Schools是正确的,它是XHTML中有效的CDATA构造,但是因为您的问题表明您的代码是HTML,并且在HTML中没有像CDATA <script>这样的内容,所以您的示例只要解释器​​看到“<”就会失败。您可以告诉浏览器它正在查看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推荐的方法。

+0

如果他使XHTML正确,那么CDATA标签将不会将其放入注释中。 (并不是说现在不需要使用XHTML。) – 2012-03-06 20:03:22

+0

谢谢,我已经详细阐述了这一点。 – danorton 2012-03-06 20:07:47

+0

我删除了所有这些以使我的示例更简单。将其添加回来并不能解决问题。我编辑了我的问题并添加了它们。 – 2012-03-06 21:02:12