CDATA标签在脚本标签中是必要的吗?如果是的话,什么时候?

换句话说,何时何地:

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

更可取的是:

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

当前回答

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

参考文献

创建声明性XML UI语言 Web的未来:富客户端、富浏览器、富门户

其他回答

HTML

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

在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)浏览器只在xmlmtl文档提供XML内容类型时使用XML解析器。

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

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

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

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

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

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

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

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

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

当浏览器将标记视为HTML,而您希望XHTML 1.0标记(例如)生效时。

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

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

如果您需要将文档解析为XML(例如,当XHTML页面被解释为XML时),并且您希望能够编写文字i<10和A && b,而不是i&lt;10和A &&b,因为默认情况下,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。