脚本标记中何时需要 CDATA 部分?

When is a CDATA section necessary within a script tag?

提问人:brad 提问时间:9/16/2008 最后编辑:Arsen Khachaturyanbrad 更新时间:10/19/2023 访问量:385533

问:

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

换句话说,何时何地:

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

比这更可取:

<script type="text/javascript">
...code...
</script>
JavaScript HTML XHTML 数据

评论

21赞 allyourcode 1/31/2012
现在XHTML基本上已经死了,这不再是一个相关的问题了吗?
84赞 Doktor J 2/22/2012
@allyourcode:是什么让你认为XHTML已经死了?HTML5的?XHTML5 可以与之相伴:)
4赞 Mihai Stancu 8/3/2012
@DoktorJ AFAIK xHTML 版本为 1。它的 HTML 等价物是版本 4。xHTML 2.0 中集中了大量精力,打算将 xform、xlink、time 和 svg 命名空间推送到规范中,以改进 HTML 5 添加的相同功能(xform/input-validation、time/animations、svg/canvas),但 xHTML 2 规范的工作重新集中在 HTML 5 功能上。这并不是说 xHTML 2 被放弃或过时了,而是在不久的将来没有计划。
14赞 JoJo 8/31/2012
XHTML在Java Seam / JSF / Facelets开发中并没有消亡。
17赞 BrainSlugs83 10/11/2012
@Mihai斯坦库——这并不完全正确。根据 W3C 的说法,HTML5 有一个 XML 语法:“另一种可用于 HTML5 的语法是 XML。此语法与 XHTML1 文档和实现兼容。使用此语法的文档需要使用 XML 媒体类型提供,并且需要按照 XML 规范规定的规则将元素放入 w3.org/1999/xhtml 命名空间中。

答:

2赞 ceejayoz 9/16/2008 #1

当您希望它进行验证时(在 XML/XHTML 中 - 谢谢,Loren Segal)。

9赞 Chris Shaffer 9/16/2008 #2

当您要严格遵守 XHTML 时,您需要 CDATA,以便 less than 和 & 符号不会被标记为无效字符。

604赞 Michael Ridley 9/16/2008 #3

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

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

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

评论

52赞 Loren Segal 9/16/2008
它不仅仅是“验证”。大多数严格的 XML 解析器在遇到非法字符时不会通过页面。这不仅仅是为了让 W3C 开心,让 W3C 变得绿色而不是红色。
42赞 bobince 9/20/2009
如果避免使用和字符,则不需要 CDATA 部分;它在 HTML 和 XHTML 中都可以正常工作。您可以通过将所有重要代码放在外部脚本中并仅使用内联脚本来轻松实现这一点,例如。初始化变量(如果需要,可以在字符串文字中转义 / 到 /)。&<&<\x26\x3C
24赞 Mathew Attlee 12/2/2009
在HTML5的情况下呢?
5赞 Alex KeySmith 11/7/2010
@Mathew Attle - 这是个好问题。在单独的线程上提出一个很好的问题,以确保它得到所需的关注。
3赞 Lightness Races in Orbit 6/10/2011
@Loren:那么它仍然完全是关于验证的。用户代理拒绝无效 XML 的程度是正交的。
18赞 Loren Segal 9/16/2008 #4

不要在 HTML4 中使用 CDATA,但在 XHTML 中使用 CDATA,并且如果您有未转义的符号(如 < 和 >),则必须在 XML 中使用 CDATA。

评论

11赞 Loren Segal 8/30/2010
CDATA 在 HTML4 中无效。简单地说,它不是语法的一部分。CDATA 是 XML 的语法,XHTML 是 XML 的子集。因此,它只能在 XML(及其子集)中使用。另一方面,HTML 不是 XML。
238赞 Shadow2531 9/16/2008 #5

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

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

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

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

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

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

评论

15赞 BryanH 11/4/2015
出于代码安全考虑,最好在 CDATA 周围加上块注释,否则如果删除换行符,代码就会中断/* ... */
0赞 matt wilkie 2/1/2017
不应该“......作为 XML“,在第一节中是”......作为非解释文本“?在 stackoverflow.com/questions/2784183/what-does-cdata-in-xml-mean 中,我们看到“......这些字符串包含可以解释为 XML 标记但不应解释为的数据。
0赞 Shadow2531 2/1/2017
@mattwilkie,我所说的“作为 XML”是指“当浏览器使用其 XML 解析器(而不是 HTML 解析器)来解析标记时,因为文档是以基于 XML 的 MIME 类型发送的,或者包含标记的文件具有基于 XML 的文件扩展名”。
136赞 user123444555621 9/20/2009 #6

[HTML全文]

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

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

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

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

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

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

或类似。

这也适用于作为 .(由于 IE 不支持 XML 内容类型,因此大多数情况下是正确的。text/html

XML格式

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

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

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

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

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

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

评论

2赞 danorton 3/7/2012
“CDATA 部分完全没有效果”这句话对于(提议的)HTML5 是不正确的,因为 HTML5 可以识别构造。w3.org/TR/html5/syntax.html#cdata-sections
3赞 user123444555621 3/7/2012
@danorton 有趣。我认为这是一个非常丑陋的组合。不过对脚本内容仍然没有影响。
2赞 Salman A 3/6/2013
不知道任何内部脚本标签都是坏的。</
3赞 user123444555621 3/6/2013
@SalmanA 这是HTML的怪异之处之一,正式名称为ETAGO。了解更多:mathiasbynens.be/notes/etago(虽然文章指出没有浏览器实现过该功能,但我很确定它给我带来了一些麻烦。也许在其他工具中)
1赞 Salman A 3/6/2013
实际上,我遇到了验证问题 - 无法验证,但在阅读了您的答案并更改为修复它之后。<script>var b = "<b>bold</b>";</script><script>var b = "<b>bold<\/b>";</script>
8赞 gehsekky 3/2/2010 #7

以避免在 XHTML 验证期间出现 XML 错误。

2赞 Tyler Carter 3/2/2010 #8

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

向后兼容性。必须喜欢它。

8赞 Ikaso 3/2/2010 #9

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

24赞 Franz 3/2/2010 #10

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

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

11赞 Alex Beardsley 3/2/2010 #11

CDATA 表示其中的内容不是 XML。

这是维基百科上的解释

17赞 LBushkin 3/2/2010 #12

它用于确保在页面中嵌入 JavaScript 而不是外部引用时 XHTML 验证正常工作。

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

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

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

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

32赞 ondra 3/2/2010 #13

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

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

但这是不切实际的。更大的问题是,如果你在HTML中阅读页面,标签脚本在“默认”下被认为是CDATA,这样的JavaScript将无法运行。因此,如果您希望使用 XHTML 和 HTML 解析器都可以使用同一页面,则需要将 script 标记包含在 XHTML 的 CDATA 元素中,但不能将其包含在 HTML 中。

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

5赞 Paul Sweatte 8/28/2012 #14

CDATA 在任何 XML 方言中都是必需的,因为 XML 节点中的文本在被计算为 JavaScript 之前被视为子元素。这也是 JSLint 抱怨正则表达式中字符的原因。<

引用

5赞 Jim 8/30/2012 #15

CDATA 表示其中的内容不是 XML。