在脚本标签中是否有必要使用 CDATA 标签,如果是这样的话?
换句话说,何时何地:
<script type="text/javascript">
//<![CDATA[
...code...
//]]>
</script>
比这更好:
<script type="text/javascript">
...code...
</script>
如果您需要将文档解析为 XML(例如,当 XHTML 页面被解释为 XML) 并且您希望能够写入文字i<10
和a && b
而不是i<10
和a && b
时,则需要 CDATA 部分a && 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>
之间的所有内容作为</script>
一部分。 有些实现甚至不需要正确的结束标记; 他们停止脚本解释为 “ 。 </
”,根据规格是正确的
更新在 HTML5 和当前浏览器中,情况不再如此。
因此,在 HTML 中,这是不可能的:
<script>
var x = '</script>';
alert(x)
</script>
CDATA
部分根本没有效果 。这就是你需要写作的原因
var x = '<' + '/script>'; // or
var x = '<\/script>';
或类似的。
这也适用于作为text/html
XHTML 文件。 (由于 IE 不支持 XML 内容类型,因此大多数情况都是如此。)
在 XML 中,适用不同的规则。请注意,如果 XHMTL 文档以 XML 内容类型提供,则(非 IE)浏览器仅使用 XML 解析器。
对于 XML 解析器, script
标记并不比任何其他标记更好。特别地,脚本节点可以包含由 “ <
” 触发的非文本子节点; 并且 “ &
” 符号表示字符实体。
所以,在 XHTML,这是不可能的:
<script>
if (a<b && c<d) {
alert('Hooray');
}
</script>
要解决此问题,您可以将整个脚本包装在CDATA
部分中。这告诉解析器:' 在本节中, 不要将 “ <
” 和 “ &
” 视为控制字符 。为了防止 JavaScript 引擎解释 “ <![CDATA[
” 和 “ ]]>
” 标记,您可以将它们包装在注释中。
如果您的脚本不包含任何 “ <
” 或 “ &
”,则无论如何都不需要CDATA
部分。