CDATA标记是否曾经在脚本标记中是必需的?何时(如果需要)?换句话说,何时何地:

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


更可取this:

<script type="text/javascript">
...code...
</script>


评论

现在XHTML已经基本失效,这不再是一个相关问题了吗?

@allyourcode:是什么让您认为XHTML已死? HTML5?还有XHTML5可以一起使用:)

@DoktorJ AFAIK xHTML的版本为1。与HTML等效的版本为版本4。xHTML2.0集中了一项工作,旨在将xform,xlink,time和svg命名空间推入规范,以改进与HTML 5相同的功能。添加-xform / input-validation,时间/动画,svg /画布-但针对xHTML 2规范的工作重新集中在HTML 5功能上。这并不是说xHTML 2被丢弃或已过时,但它并没有在不久的将来进行计划。

XHTML尚未在Java Seam / JSF / Facelets开发中消失​​。

@Mihai Stancu-并不完全正确。根据W3C的说法,HTML5有一种XML语法:“可用于HTML5的另一种语法是XML。该语法与XHTML1文档和实现兼容。使用该语法的文档必须与XML媒体类型一起使用,并且元素需要遵循XML规范规定的规则放在w3.org/1999/xhtml命名空间中。”

#1 楼

如果您需要将文档解析为XML(例如,将XHTML页面解释为XML),并且希望能够编写文字i<10a && b而不是i&lt;10a &amp;&amp; b,则需要CDATA部分,因为XHTML会解析JavaScript代码作为解析的字符数据,而不是默认情况下的字符数据。这不是存储在外部源文件中的脚本的问题,但是对于XHTML中的任何内联JavaScript,您可能都想使用CDATA部分。

请注意,许多XHTML页面从不打算解析为XML,在这种情况下就不会有问题。

有关此主题的出色文章,请参阅https://web.archive.org/web/20140304083226/http://javascript。 about.com/library/blxhtml.htm

评论


除了“验证”之外,还有很多其他功能。如果最严格的XML解析器遇到非法字符,则不会浏览该页面。这不仅仅是让W3C开心起来,变得绿色而不是红色。

–劳伦·西格尔(Loren Segal)
08/09/15在20:58

如果避免使用&和<字符,则不需要CDATA部分。在HTML和XHTML中都可以正常工作。您可以通过将所有重要的代码放入外部脚本中,而仅使用内联脚本来轻松实现此目的。初始化变量(如果需要,将&/ <转义为字符串文字中的\ x26 / \ x3C)。

– bobince
09年9月20日在9:10

如果是HTML5,该怎么办?

–马修·艾德礼(Mathew Attlee)
09年12月2日,11:44

@Mathew Attle-这是一个很好的问题。在一个单独的线程上提出一个很好的问题,以确保它获得所需的关注。

– Alex KeySmith
2010年11月6日,19:01

@Loren:那仍然完全是关于验证的。用户代理拒绝无效XML的程度是正交的。

–轨道轻度竞赛
2011年6月9日18:09

#2 楼

当浏览器将标记视为XML时:

<script>
<![CDATA[
    ...code...
]]>
</script>


当浏览器将标记视为HTML时:

<script>
    ...code...
</script>


当浏览器将标记视为HTML且您希望您的XHTML 1.0标记(例如)通过验证时。

<script>
//<![CDATA[
    ...code...
//]]>
</script>


评论


出于代码安全的考虑,最好将CDATA用块注释/ * ... * /括起来,因为否则,如果删除了换行符,代码将中断

– BryanH
2015年11月3日在20:05

第一部分中的“ ...作为XML”不应该是“ ...作为未解释的文本”吗?在stackoverflow.com/questions/2784183/what-does-cdata-in-xml-mean中,我们看到“ ...这些字符串包括可以解释为XML标记的数据,但不应如此。”

–马特·威尔基
17年1月31日在20:38

@mattwilkie,我所说的“作为XML”是“当浏览器使用其XML解析器(而不是HTML解析器)来解析标记时,因为文档是使用基于XML的mime类型发送的,或者包含标记的文件具有基于XML的文件扩展名”。

–Shadow2531
17年2月1日在12:07

#3 楼

HTML

HTML解析器会将<script></script>之间的所有内容都视为脚本的一部分。有些实现甚至不需要正确的结束标记。他们会在“ </”处停止脚本解释,这根据规范是正确的。


Update在HTML5和当前的浏览器中已不再是这种情况。


因此,在HTML中,这是不可能的:

<script>
var x = '</script>';
alert(x)
</script>


CDATA部分完全无效。这就是为什么您需要编写

var x = '<' + '/script>'; // or
var x = '<\/script>';


或类似的方法。

这也适用于用作text/html的XHTML文件。 (由于IE不支持XML内容类型,因此大多数情况都是这样。)

XML

在XML中,适用不同的规则。请注意,(非IE)浏览器仅在XHMTL文档带有XML内容类型时才使用XML解析器。对于XML解析器,script标记并不比任何其他标记都要好。特别地,脚本节点可以包含非文本子节点,由“ <”触发;

因此,在XHTML中,这是不可能的:

<script>
if (a<b && c<d) {
    alert('Hooray');
}
</script>


要解决此问题,您可以将整个脚本包装在&部分中。这告诉解析器:“在本节中,请勿将“ CDATA”和“ <”视为控制字符。为防止JavaScript引擎解释“ &”和“ <![CDATA[”标记,可以将它们包装在注释中。

如果脚本中不包含任何“ ]]>”或“ <”,则不要仍然需要一个&部分。

评论


对于(建议的)HTML5来说,“ CDATA节根本没有任何作用”的说法是不正确的,它可以识别该构造。 w3.org/TR/html5/syntax.html#cdata-sections

–丹诺顿
2012年3月6日在20:29

@danorton有趣。我认为这很丑陋。虽然在脚本内容上仍然没有效果。

–user123444555621
2012年3月6日22:06

不知道脚本标记内的任何
–萨拉曼A
13年5月5日在18:38

@SalmanA这是HTML的怪异之一,正式称为ETAGO。了解更多信息:mathiasbynens.be/notes/etago(尽管文章指出,没有浏览器实现过该功能,但我敢肯定,这会给我造成麻烦。也许在其他工具中)

–user123444555621
13年5月5日在20:35

实际上,我遇到了验证问题-