在脚本标记中何时需要CDATA部分?
在脚本标记中是否需要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
a && b
,因为默认情况下,XHTML会将JavaScript代码解析为分析字符数据,而不是字符数据。 这不是存储在外部源文件中的脚本的问题,但对于XHTML中的任何内联JavaScript,您可能需要使用CDATA部分。
请注意,许多XHTML页面从来没有打算被解析为XML,在这种情况下,这不会是一个问题。
有关该主题的优秀评论,请参阅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
部分。