协慌网

登录 贡献 社区

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

在脚本标签中是否有必要使用 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时,则需要 CDATA 部分a &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

HTML 解析器将处理<script></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 中,适用不同的规则。请注意,如果 XHMTL 文档以 XML 内容类型提供,则(非 IE)浏览器仅使用 XML 解析器。

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

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

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

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

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