it-swarm.cn

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

在脚本标签中是否有必要使用CDATA标签,如果是这样的话?

换句话说,何时何地:

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

比这更好:

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

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

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

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

567
Michael Ridley

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

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

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

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

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

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

HTML

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

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

所以,在HTML中,这是not可能:

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

CDATA部分有 完全没有效果 。这就是你需要写作的原因

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

或类似的。

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

XML

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

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

所以,在XHTML中,这是not可能:

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

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

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

121
user123444555621

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

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

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

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

30
ondra

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

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

23
Franz

Do not 在HTML4中使用CDATA,但你 应该 在XHTML中使用CDATA和 必须 如果你有像<和>这样的非转义符号,则使用XML格式的CDATA。

18
Loren Segal

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

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

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

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

您可以在这里学习 有关CDATA的更多信息 ,和 更多关于XHTML的信息

17
LBushkin

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

这是对 维基百科的解释

10
Alex Beardsley

当您要求严格的XHTML合规性时,您需要CDATA,并且&amprsands不会被标记为无效字符。

9
Chris Shaffer

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

8
gehsekky

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

8
Ikaso

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

6
Jim

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

参考文献

5
Paul Sweatte

当你想要它验证时 (在XML/XHTML中 - 谢谢, Loren Segal )。

2
ceejayoz

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

向后兼容性。一定要喜欢它。

2
Tyler Carter