何时在脚本标记中需要CDATA节?


907

脚本标记中是否曾经需要CDATA标记?如果需要,何时?

换句话说,何时何地:

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

对此更可取:

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

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

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

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

14
XHTML在Java Seam / JSF / Facelets开发中并未失败。
JoJo 2012年

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

Answers:


585

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

请注意,绝不会将许多XHTML页面解析为XML,在这种情况下,这不会成为问题。

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


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

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

23
如果是HTML5,该怎么办?
Mathew Attlee

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

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

231

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

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

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

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

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

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

12
就代码安全而言,最好在CDATA中加上块注释,/* ... */因为否则,如果删除了换行符,则代码将中断
BryanH 2015年

第一部分中的“ ...作为XML”不应该是“ ...作为非解释文本”吗?在stackoverflow.com/questions/2784183/what-does-cdata-in-xml-mean我们看到了“......这些字符串包含的数据可能被解释为XML标记,但不应该是。”
马特·威尔基

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

127

的HTML

HTML解析器将把之间的一切<script>,并</script>作为脚本的一部分。有些实现甚至不需要正确的结束标记。他们在“ </” 处停止了脚本解释,这根据规格是正确的

在HTML5中更新,并且在当前的浏览器中,情况不再如此。

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

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

一个CDATA部分根本没有效果。这就是为什么你需要写

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

或类似。

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

XML格式

在XML中,适用不同的规则。请注意,(非IE)浏览器仅在XHMTL文档带有XML内容类型时才使用XML解析器。

对于XML解析器,script标记并不比其他任何标记都要好。特别地,脚本节点可以包含由“ <” 触发的非文本子节点。“ &”符号表示字符实体。

所以,在XHTML,这是不是可能:

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

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

如果您的脚本中不包含任何“ <”或“ &”,则CDATA无论如何都不需要节。


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

3
@danorton有趣。我认为这太丑陋了。虽然在脚本内容上仍然没有效果。
user123444555621 2012年

2
不知道任何 </内部脚本标记都是不好的。
Salman A

3
@SalmanA这是HTML的怪异之一,正式称为ETAGO。了解更多信息:mathiasbynens.be/notes/etago(尽管文章指出,没有浏览器实现过该功能,但我敢肯定这
会给

1
实际上,我遇到了验证问题- <script>var b = "<b>bold</b>";</script>无法验证,但是在阅读了您的答案并更改为<script>var b = "<b>bold<\/b>";</script>固定问题之后。
Salman A

30

基本上是允许编写XHTML和HTML的文档。问题是在XHTML中,XML解析器将解释script标记中的&,<,>字符,并导致XML解析错误。因此,您可以使用实体编写JavaScript,例如:

if (a &gt; b) alert('hello world');

但这是不切实际的。更大的问题是,如果您以HTML格式读取页面,则标记脚本被视为“默认情况下”为CDATA,并且此类JavaScript将无法运行。因此,如果您希望使用XHTML和HTML解析器都可以使同一页面正常运行,则需要将脚本括起来标记在XHTML的CDATA元素中,而不是将其标记在HTML中。

这个技巧将CDATA元素的开始标记为JavaScript注释;在HTML中,JavaScript解析器将忽略CDATA标记(这是注释)。在XHTML中,XML解析器(在JavaScript之前运行)检测到该解析器并将其余部分(直到CDATA结束)视为CDATA。


24

这是X(HT)ML的东西。当您在JavaScript中使用<>之类的符号(例如,比较两个整数)时,必须像XML一样对其进行解析,因此它们将被标记为标签的开头或结尾。

CDATA表示以下各行(直到的所有]]>内容都不是XML,因此不应以这种方式进行解析。


18

难道不是在HTML4使用CDATA,但你应该在XHTML使用CDATA和必须,如果你有一个像<和>转义符号使用CDATA在XML。


11
CDATA在HTML4中无效。简而言之,它不是语法的一部分。CDATA是XML的语法,而XHTML是XML的子集。因此,只能在XML(及其子集)内部使用。另一方面,HTML不是XML。
罗伦·西格尔

17

它可以确保当您的页面中而不是外部引用中嵌入JavaScript时,XHTML验证可以正常工作。

XHTML要求您的页面严格遵守XML标记要求。由于JavaScript可能包含具有特殊含义的字符,因此必须将其包装在CDATA中以确保验证不会将其标记为格式错误。

使用网络上的HTML页面,您只需在和标记之间包含所需的JavaScript。当您验证网页上的HTML时,JavaScript内容被视为CDATA(字符数据),因此验证器将其忽略。如果您在设置网页时遵循最新的XHTML标准,则情况并非如此。使用XHTML时,脚本标记之间的代码被认为是PCDATA(解析的字符数据),因此由验证器处理。

因此,您不能只在页面的脚本标签之间包含JavaScript而不会“破坏”您的网页(至少就验证器而言)。

您可以在此处了解有关CDATA的更多信息,并在此处了解有关XHTML的更多信息



9

当您要严格遵守XHTML时,您需要CDATA,以使小于和与符号不会被标记为无效字符。


8

以避免在xhtml验证期间出现xml错误。


8

CDATA告诉浏览器按原样显示文本,而不是将其呈现为HTML。





2

这样,较旧的浏览器就不会解析Javascript代码,并且页面也不会中断。

向后兼容。要爱它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.