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>
当前回答
基本上,它允许编写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。
这是维基百科上的解释
CDATA在任何XML方言中都是必需的,因为XML节点中的文本在作为JavaScript计算之前被视为子元素。这也是JSLint抱怨正则表达式中的<字符的原因。
参考文献
创建声明性XML UI语言 Web的未来:富客户端、富浏览器、富门户
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节。
当您想要验证它时(在XML/XHTML中-感谢Loren Segal)。
这是X(HT)ML的问题。当你在JavaScript中使用像<和>这样的符号时,例如比较两个整数,这将不得不像XML一样被解析,因此它们将标记为标记的开始或结束。
CDATA意味着下面的行(直到]]>的所有内容都不是XML,因此不应该以这种方式解析。