脚本标签中是否有必要使用CDATA标签,如果是这样的话?
换句话说,何时何地:
<script type="text/javascript">
//<![CDATA[
...code...
//]]>
</script>
比这更好:
<script type="text/javascript">
...code...
</script>
答案 0 :(得分:567)
如果您需要将文档解析为XML(例如,当XHTML页面被解释为XML)并且您希望能够编写文字i<10
和{{1}时,则需要CDATA部分而不是a && b
和i<10
,因为XHTML会将JavaScript代码解析为已解析的字符数据,而不是默认情况下的字符数据。对于存储在外部源文件中的脚本,这不是问题,但对于XHTML中的任何内联JavaScript,您可能想要使用CDATA部分。
请注意,许多XHTML页面从未打算被解析为XML,在这种情况下,这不会成为问题。
有关该主题的详细说明,请参阅https://web.archive.org/web/20140304083226/http://javascript.about.com/library/blxhtml.htm
答案 1 :(得分:231)
当浏览器将标记视为XML时:
<script>
<![CDATA[
...code...
]]>
</script>
当浏览器将标记视为HTML时:
<script>
...code...
</script>
当浏览器将标记视为HTML并且您希望XHTML 1.0标记(例如)验证时。
<script>
//<![CDATA[
...code...
//]]>
</script>
答案 2 :(得分:121)
HTML解析器会将<script>
和</script>
之间的所有内容视为脚本的一部分。 某些实现甚至不需要正确的结束标记;他们停止脚本解释为“这是正确的。 </
”,根据specs
更新在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
部分。
答案 3 :(得分:30)
基本上是允许编写既是XHTML又是HTML的文档。问题是在XHTML中,XML解析器将解释&amp;,&lt;,&gt; 脚本标记中的字符并导致XML解析错误。因此,您可以使用实体编写JavaScript,例如:
if (a > b) alert('hello world');
但这是不切实际的。更大的问题是,如果您在HTML中阅读该页面,则标签 script 默认被视为CDATA',并且此类JavaScript将无法运行。因此,如果您希望同一页面都可以使用XHTML和HTML解析器,则需要在XHTML中将脚本标记括在CDATA元素中,但不要将其括在HTML中。
这个技巧标志着CDATA元素作为JavaScript注释的开始;在HTML中,JavaScript解析器忽略CDATA标记(它是注释)。在XHTML中,XML解析器(在JavaScript之前运行)检测到它并将其余部分视为CDATA结束为CDATA。
答案 4 :(得分:23)
这是一个X(HT)ML的事情。在JavaScript中使用<
和>
等符号时,例如为了比较两个整数,这必须像XML一样进行解析,因此它们将标记为标记的开头或结尾。
CDATA意味着以下行(]]>
以外的所有内容都不是XML,因此不应该这样解析。
答案 5 :(得分:18)
不在HTML4中使用CDATA,但 应该在XHTML中使用CDATA,而必须在XML中使用CDATA,如果你有未转义的符号,例如&lt; ;和&gt;。
答案 6 :(得分:17)
确保在您的网页中嵌入JavaScript时,XHTML验证可以正常运行,而非外部引用。
XHTML要求您的页面严格符合XML标记要求。由于JavaScript可能包含具有特殊含义的字符,因此必须将其包装在CDATA中以确保验证不会将其标记为格式错误。
使用网页上的HTML页面,您可以在标签和标签之间添加所需的JavaScript。在网页上验证HTML时,JavaScript内容被视为CDATA(字符数据),因此验证程序会忽略它。如果您在设置网页时遵循最新的XHTML标准,则情况并非如此。使用XHTML,脚本标记之间的代码被认为是PCDATA(解析后的字符数据),因此由验证器处理。
因此,您不能在页面上的脚本标记之间包含JavaScript而不会“破坏”您的网页(至少就验证程序而言)。
答案 7 :(得分:10)
CDATA表示其中的内容不是XML。
以下是对wikipedia
的解释答案 8 :(得分:9)
当您要求严格的XHTML合规性时,您需要的CDATA小于且不会将&符号标记为无效字符。
答案 9 :(得分:8)
在xhtml验证期间避免xml错误。
答案 10 :(得分:8)
CDATA告诉浏览器按原样显示文本,而不是将其呈现为HTML。
答案 11 :(得分:6)
CDATA表示其中的内容不是XML。
答案 12 :(得分:5)
任何XML方言都需要CDATA,因为XML节点中的文本在被评估为JavaScript之前被视为子元素。这也是JSLint complains关于正则表达式中<
字符的原因。
<强>参考强>
答案 13 :(得分:2)
When you want it to validate(在XML / XHTML中 - 谢谢,Loren Segal)。
答案 14 :(得分:2)
这样旧的浏览器就不会解析Javascript代码而页面也不会中断。
向后兼容性。一定要喜欢它。