CDATA标签在脚本标签中是必要的吗?如果是的话,什么时候?
换句话说,何时何地:
<script type="text/javascript">
//<![CDATA[
...code...
//]]>
</script>
更可取的是:
<script type="text/javascript">
...code...
</script>
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,因为默认情况下,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>之间的所有内容视为脚本的一部分。有些实现甚至不需要正确的结束标记;它们在“</”处停止脚本解释,根据规范,这是正确的。
在HTML5和当前的浏览器中,情况不再是这样了。
所以,在HTML中,这是不可能的:
<script>
var x = '</script>';
alert(x)
</script>
CDATA节根本没有任何作用。这就是你需要写作的原因
var x = '<' + '/script>'; // or
var x = '<\/script>';
或类似的。
这也适用于作为text/html格式的XHTML文件。(因为IE不支持XML内容类型,这在很大程度上是正确的。)
XML
在XML中,应用不同的规则。注意,(非IE)浏览器只在xmlmtl文档提供XML内容类型时使用XML解析器。
对于XML解析器来说,脚本标记并不比任何其他标记好。特别是,脚本节点可以包含非文本子节点,由"<"触发;“&”符号表示字符实体。
因此,在XHTML中,这是不可能的:
<script>
if (a<b && c<d) {
alert('Hooray');
}
</script>
要解决这个问题,可以将整个脚本包装在CDATA部分中。这告诉解析器:“在本节中,不要将“<”和“&”作为控制字符。”防止JavaScript引擎解释“<!”[CDATA["和"]]>"标记,您可以将它们包装在注释中。
如果脚本不包含任何“<”或“&”,那么无论如何都不需要CDATA节。
这是X(HT)ML的问题。当你在JavaScript中使用像<和>这样的符号时,例如比较两个整数,这将不得不像XML一样被解析,因此它们将标记为标记的开始或结束。
CDATA意味着下面的行(直到]]>的所有内容都不是XML,因此不应该以这种方式解析。
它可以确保在页面中嵌入JavaScript(而不是外部引用)时XHTML验证能够正确工作。
XHTML要求页面严格符合XML标记要求。由于JavaScript可能包含具有特殊含义的字符,因此必须将其包装在CDATA中,以确保验证不会将其标记为畸形格式。
With HTML pages on the web you can just include the required JavaScript between and tags. When you validate the HTML on your web page the JavaScript content is considered to be CDATA (character data) that is therefore ignored by the validator. The same is not true if you follow the more recent XHTML standards in setting up your web page. With XHTML the code between the script tags is considered to be PCDATA (parsed character data) which is therefore processed by the validator. Because of this, you can't just include JavaScript between the script tags on your page without 'breaking' your web page (at least as far as the validator is concerned).
您可以在这里了解更多关于CDATA的知识,在这里了解更多关于XHTML的知识。
基本上,它允许编写XHTML和HTML两种格式的文档。问题在于,在XHTML中,XML解析器将解释脚本标记中的&、<、>字符,并导致XML解析错误。因此,你可以用实体来编写JavaScript,例如:
if (a > b) alert('hello world');
但这是不切实际的。更大的问题是,如果以HTML格式读取页面,标记脚本“默认”被认为是CDATA,这样的JavaScript将无法运行。因此,如果希望同一页面使用XHTML和HTML解析器都没问题,则需要将脚本标记包含在XHTML中的CDATA元素中,而不是将其包含在HTML中。
这个技巧将CDATA元素的开始标记为JavaScript注释;在HTML中,JavaScript解析器会忽略CDATA标签(它是一个注释)。在XHTML中,XML解析器(在JavaScript之前运行)检测到它,并将直到CDATA结束的其余部分视为CDATA。
CDATA在任何XML方言中都是必需的,因为XML节点中的文本在作为JavaScript计算之前被视为子元素。这也是JSLint抱怨正则表达式中的<字符的原因。
参考文献
创建声明性XML UI语言 Web的未来:富客户端、富浏览器、富门户