我试图在每个浏览器中运行以下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,我最初删除了该问题,问题仍然存在。
答案 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">