我应该在xHTML中使用 "]]>" 还是 "//]]>" 来关闭CDATA部分?

17

我想将脚本或CSS内联到XHTML中,而不需要转义特殊字符。

我可以使用 CDATA 标记的部分来实现。

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

   <script type="text/javascript">
      <![CDATA[
         ... unescaped script content ...
      ]]>
   </script>

根据http://www.w3schools.com/TAGS/tag_script.asp,CDATA 可以如下所示:

   <script type="text/javascript"><![CDATA[
     // some code
   //]]></script>

如何更好地关闭CDATA部分?]]>还是//]]>


1
或者,只需将脚本外部化。顺便说一下:有一些MVC框架是基于XHTML的(因为它们使用XML工具来解析源代码/生成输出)。这是XHTML唯一适用的地方。 - BalusC
4个回答

34
根据www.w3.org/TR/xhtml1/#h-4.8,可以将CDATA部分定义为:[no //]
是的,在XHTML中可以这样做。只有在像非IE浏览器这样的XML解析器读取时,才能正确地阅读作为提供的Proper XHTML。
但是,您可能实际上正在提供

避免这样做,你会更快乐。赞成。 - user241244
@Colonel Sponsz,我在开始学习编程时使用了W3schools一段时间,没有遇到任何问题。另外,w3fools在哪里说w3schools不好? - hellol11

3

取决于浏览器。尽管有些人认为w3schools与W3C相关,但是他们的建议应该谨慎采纳。

现代浏览器应该能够识别CDATA部分。然而,MSIE不支持XHTML,但这没关系(您不会将XHTML内容作为text/html发送以获得MSIE兼容性吧?那么使用XHTML就没有什么意义了)。

问题在于,不完全理解XHTML的浏览器将CDATA指令视为常规文本。

简而言之:完全向后兼容的解决方案应该是:

<script type="text/javascript"><!--//<![CDATA[
code goes here...
//]]>--></script>

那真是太令人厌恶了。如果您想保持向后兼容性,请将JS放入JS文件中,或者坚持使用HTML,直到您可以忽略MSIE 8(考虑到人们花了多少年时间来抛弃MSIE 6,这可能会在2020年左右)。
HTML注释(<!-- -->)仅适用于不理解脚本标记的浏览器。双斜杠对于不理解CDATA部分的浏览器(即非XHTML浏览器,如MSIE)是必需的。为了避免XML格式不正确(例如,大于和小于比较会破坏XML或需要转义,这又是一个浏览器问题),XHTML需要CDATA部分。
有关将XHTML作为文本/ HTML发送的问题的更多信息,请阅读:http://hixie.ch/advocacy/xhtml 编辑:根据Hixie的说法,向后支持的完整语法实际上是这样的:
  <script type="text/javascript"><!--//--><![CDATA[//><!--
    ...
  //--><!]]></script>

感谢您,Alohci。

鉴于您提到了Hixie的文章,我认为您应该引用他在其中提供的咒语,这比您的答案要复杂得多。 - Alohci
那个咒语是为了支持不理解<script><style>元素的HTML4加XHTML1加古老的pre-HTML3.2浏览器而设计的。目前已经没有pre-HTML3.2浏览器存在,实际上在我想出这个方法的时候也并不存在(http://www.doxdesk.com/personal/posts/wd/20010911-cdata.html)。因此不应该再使用它。 - bobince
是的,但问题仍然存在。如果您担心转义cdata部分,因为您将XHTML发送到解析为标记soup的浏览器作为HTML,则做法是错误的。如果要使用XHTML,请勿将其作为text/html发送。如果使用HTML,请勿在其中放置CDATA部分。除此之外,我的建议仍然是:如果要确保没有浏览器出现问题,请将脚本从HTML中移出。 - Alan Plum
回到六年前,我应该补充一下,除非你真的在使用XHTML(而不是HTML),否则根本不应该使用CDATA部分。检查是否正在使用XHTML的最佳方法是添加格式不正确的XML(例如错过了闭合标记)。如果浏览器不拒绝呈现它,那么它实际上将其视为HTML,你的XHTML只是无意义的标记汤。在现代网络中,XHTML已经死亡,HTML获胜了。 - Alan Plum

1

我会直接去掉 //。这些是为了欺骗某些浏览器(不想透露名字)在脚本标签中接受闭合括号的旧时代的产物。


2
不,这与旧问题 <!-- ... --> 毫不相同(确实已经过时)。在 HTML4 中,脚本元素中的未装饰的 <![CDATA 不会被省略,浏览器 因此而出错。试试吧 - 你会得到一个 JavaScript 错误。 - bobince

0
如果你担心有人使用一个完全不了解XHTML的非常老的浏览器,你可以在CDATA标记之前放置注释。但是,为了防止它引起语法错误,你必须在开始标记之前也放置一个注释:
<script type="text/javascript">
//<![CDATA[
  // some code
//]]>
</script>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接