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

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

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

比这个更好:

<script type="text/javascript">
...code...
</script>
有帮助吗?

解决方案

如果您需要将文档解析为 XML(例如当 XHTML 页面被解释为 XML 时) 并且你希望能够写出文字 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

其他提示

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

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

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

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

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

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

超文本标记语言

HTML 解析器将处理之间的所有内容 <script></script> 作为脚本的一部分。 有些实现甚至不需要正确的结束标签;他们在“处停止脚本解释”</”,根据 眼镜.

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

所以,在 HTML 中,这是 不是 可能的:

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

A CDATA 部分有 完全没有效果. 。这就是为什么你需要写

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

或类似的。

这也适用于用作的 XHTML 文件 text/html. 。(由于 IE 不支持 XML 内容类型,所以这基本上是正确的。)

XML

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

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

所以,在 XHTML 中,这是 不是 可能的:

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

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

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

基本上它是允许编写 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。

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

CDATA 表示以下几行(直到 ]]> 不是 XML,因此不应以这种方式进行解析。

不是 在 HTML4 中使用 CDATA 但你 应该 在 XHTML 中使用 CDATA 以及 必须 如果您有未转义的符号(如 < 和 >),请在 XML 中使用 CDATA。

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

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

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

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

你可以学习 有关 CDATA 的更多信息请点击此处, , 和 有关 XHTML 的更多信息请参见此处.

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

这里有一个解释 维基百科

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

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

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

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

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

参考

当你想要它验证时 (在 XML/XHTML 中 - 谢谢, 洛伦·西格尔).

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top