脚本标签中什么时候需要CDATA部分?

脚本标签中是否需要CDATA标签,如果是,什么时候?

换句话说,这是何时何地:

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

最好是这样:

<script type="text/javascript">...code...</script>
378024 次浏览

当你想让它生效的时候(在XML/XHTML中-谢谢,罗伦·西格尔)。

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

如果您需要将文档解析为XML(例如,当XHTML页面被解释为XML时),则需要CDATA部分您希望能够编写文字#0和#1而不是#2和#3,因为XHTML将把JavaScript代码解析为解析的字符数据,而不是默认的字符数据。这对于存储在外部源文件中的脚本来说不是问题,但对于XHTML中的任何内联JavaScript,您将可能希望使用CDATA部分。

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

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

没有在HTML4中使用CDATA,但应该在XHTML中使用CDATA,必须在XML中使用CDATA,如果您有像<和>这样的未转义符号。

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

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

当浏览器将标记视为超文本标记语言时:

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

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

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

超文本标记语言

超文本标记语言解析器将把<script></script>之间的所有内容视为脚本的一部分。

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

所以,在超文本标记语言中,这是没有可能的:

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

CDATA部分有一点效果都没有。这就是为什么你需要写

var x = '<' + '/script>'; // orvar 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部分中。这告诉解析器:'在本节中,不要将“#1”和“#2”视为控制字符'。为了防止JavaScript引擎解释“<![CDATA[”和“]]>”标记,您可以将它们包装在注释中。

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

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

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

向后兼容。必须爱它。

CDATA告诉浏览器按原样显示文本,而不是将其呈现为超文本标记语言。

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

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

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

这里有一个关于wikipedia的解释

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

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

对于Web上的超文本标记语言页面,您可以只在和标签之间包含所需的JavaScript。当您验证网页上的超文本标记语言时,JavaScript内容被认为是CDATA(字符数据),因此被验证器忽略。如果您在设置网页时遵循最新的XHTML标准,则情况并非如此。对于XHTML,脚本标签之间的代码被认为是PCDATA(解析的字符数据),因此由验证器处理。

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

你可以学习更多关于CDATA更多关于XHTML

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

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

但这是不切实际的。更大的问题是,如果你用超文本标记语言读取页面,标签脚本默认被认为是CDATA,这样的JavaScript将无法运行。因此,如果你想使用XHTML和超文本标记语言解析器都OK同一个页面,你需要在XHTML中的CDATA元素中包含脚本标签,但不要在文本超标记语言中包含它。

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

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

参考文献

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