无法在CDATA中运行JavaScript

Mik*_*rov 4 html javascript 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>
Run Code Online (Sandbox Code Playgroud)

他们都没有显示警报.Chrome在控制台中记录错误:Uncaught SyntaxError:Unexpected token <.似乎在CDATA宣言中抱怨拳头.Firefox还会记录"语法错误"

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

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

dan*_*ton 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>
Run Code Online (Sandbox Code Playgroud)

事实上,这是万维网联盟(W3C)在XHTML媒体类型A.4中推荐的方法.嵌入式样式表和脚本.


Pek*_*ica 5

相关问题 脚本标记中何时需要CDATA部分?解释了在XHTML文档中嵌入脚本时建议使用CDATA部分.但是,仅将XHTML doctype设置为测试文档是不够的.CDATA仍被视为语法错误.

根据这篇博文,这是因为内容类型需要与doctype定义相匹配.正确的XHTML需要Content-type设置以下标头:

Content-type: application/xhtml+xml
Run Code Online (Sandbox Code Playgroud)

如果没有指定并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>?
Run Code Online (Sandbox Code Playgroud)