951

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

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

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

比这更可取:

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

15 回答 15

600

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

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

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

于 2008-09-15T20:54:44.943 回答
236

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

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

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

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

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

<script>
//<![CDATA[
    ...code...
//]]>
</script>
于 2008-09-15T20:58:56.617 回答
135

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节。

于 2009-09-20T09:05:20.590 回答
32

基本上它是允许编写一个既是 XHTML 又是 HTML 的文档。问题是在 XHTML 中,XML 解析器会解释脚本标签中的 &,<,> 字符并导致 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。

于 2010-03-01T19:26:26.147 回答
24

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

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

于 2010-03-01T19:19:36.257 回答
18

不要在 HTML4 中使用 CDATA,但您应该XHTML 中使用 CDATA,并且如果您有像 < 和 > 这样的非转义符号,则必须在 XML 中使用 CDATA。

于 2008-09-15T20:56:21.117 回答
17

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

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

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

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

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

于 2010-03-01T19:20:35.020 回答
11

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

这是维基百科上的解释

于 2010-03-01T19:19:43.650 回答
9

当您要严格遵守 XHTML 时,您需要 CDATA 小于,并且不会将 & 标记为无效字符。

于 2008-09-15T20:54:38.267 回答
8

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

于 2010-03-01T19:19:12.170 回答
8

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

于 2010-03-01T19:19:19.267 回答
5

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

参考

于 2012-08-27T20:37:56.907 回答
5

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

于 2012-08-29T22:50:32.787 回答
2

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

于 2008-09-15T20:53:21.997 回答
2

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

向后兼容。一定会喜欢的。

于 2010-03-01T19:19:14.677 回答