我应该使用"]]>"或"//]]>"将CDATA部分关闭到xHTML中

Mar*_*arc 17 html javascript css xhtml cdata

我想在不转义特殊字符的情况下将脚本或CSS内联到XHTML中.

我可以使用CDATA标记的部分来做到这一点.

根据http://www.w3.org/TR/xhtml1/#h-4.8,CDATA部分可以定义为:

   <script type="text/javascript">
      <![CDATA[
         ... unescaped script content ...
      ]]>
   </script>
Run Code Online (Sandbox Code Playgroud)

然后,根据http://www.w3schools.com/TAGS/tag_script.asp,CDATA可以看起来像:

   <script type="text/javascript"><![CDATA[
     // some code
   //]]></script>
Run Code Online (Sandbox Code Playgroud)

关闭CDATA部分的哪种方法更好?]]>还是//]]>

bob*_*nce 33

根据www.w3.org/TR/xhtml1/#h-4.8,CDATA部分可以定义为:[no //]

是啊.在XHTML中,他们可以.正确的XHTML,由XML解析器读取,就像您服务application/xhtml+xml于非IE的Web浏览器一样.

但是,您实际上可能正在服务text/html,这意味着您的浏览器不是该部分中引用的"XML处理器".它是遗留的HTML4解析器,因此您必须遵守附录C准则并避免使用HTML4中不起作用的任何XML功能.

特别是,字符串<![CDATA[]]>一个<script>或一个<style>块对HTML4解析器并不特殊,因为在HTML4中,这两个元素是'CDATA元素',其中标记不适用(除了</ETAGO序列以结束元素本身).因此,HTML4解析器会将这些字符串直接发送到CSS或JavaScript引擎.

因为<![CDATA[JS无效,所以会出现JavaScript语法错误.(其他答案在这里是错误的:它不仅仅是非常古老的浏览器,而是所有HTML4浏览器,它们会在脚本中为未注释的CDATA部分提供错误.)

您可以使用///*注释标记来隐藏JavaScript或CSS引擎中的内容.所以:

<script type="text/javascript">//<![CDATA[
    alert('a&b');
//]]></script>
Run Code Online (Sandbox Code Playgroud)

(注意领先//; W3Schools示例代码中省略了这一点,并使该示例代码完全不起作用.失败.不要相信W3Schools:它们与W3C无关,它们的材料通常都是垃圾.)

这由HTML解析器读取为:

  • 开放标签script建立CDATA内容直到下一个ETAGO
  • 文本 //<![CDATA[\n alert('a&b');\n//]]>
  • ETAGO和close-tag script
  • - >结果内容发送到JavaScript引擎: //<![CDATA[\nalert('a&b');\n//]]>

但是通过XML解析器:

  • 开放标签script(没有特殊的解析含义)
  • 文字内容 //
  • 打开CDATA部分,建立CDATA内容,直到下一个]]>序列
  • 文本 \n alert('a&b');\n//
  • 关闭CDATA部分
  • 关闭标签 script
  • - >结果内容发送到JavaScript引擎: //\nalert('a&b');\n//

虽然解析过程完全不同,但JS引擎在每种情况下都会得到相同的有效代码,这要归功于//s,唯一的区别在于注释.

请注意,这是一个与老派截然不同的案例:

<script type="text/javascript"><!--
    alert('a&b');
//--></script>
Run Code Online (Sandbox Code Playgroud)

这是为了隐藏脚本/样式内容,以便它不会在不理解<script><style>标记的浏览器中写入页面.这不会产生JavaScript/CSS错误,因为hack被置于不同的级别:它是CSS和JavaScript语言本身的语法特征,<!--被定义为什么都不做,允许这个hack工作.

那些浏览器是古老的历史; 你今天绝对不应该使用这种技术.特别是在XHTML中,因为XML解析器会引起你的注意,将整个脚本块转换为XML注释而不是可执行代码.

我想在不转义特殊字符的情况下将脚本或CSS内联到xHTML中.

避免这样做,你会更快乐.

真的需要<和中的&角色<style>吗?不,几乎从不.你真的需要他们<script>吗?嗯...有时,是的,在这种情况下,评论的CDATA部分是可以接受的.

但说实话,XHTML兼容性指南C.4与HTML4一样适用于XHTML1:任何非平凡的东西都应该是外部脚本,然后您不必担心这一点.