脚本标记中是否曾经需要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>
Answers:
如果您需要将文档以XML格式解析(例如,当XHTML页面被解释为XML格式)并且您希望能够编写文字i<10
而a && b
不是i<10
and时a && b
,则需要CDATA部分,因为XHTML会将JavaScript代码解析为解析的字符数据与默认情况下的字符数据相反。这不是存储在外部源文件中的脚本的问题,但是对于XHTML中的任何内联JavaScript,您可能都想使用CDATA部分。
请注意,绝不会将许多XHTML页面解析为XML,在这种情况下,这不会成为问题。
有关此主题的出色文章,请参见https://web.archive.org/web/20140304083226/http://javascript.about.com/library/blxhtml.htm
&
和<
字符,则不需要CDATA部分。在HTML和XHTML中都可以正常工作。您可以通过将所有重要的代码放入外部脚本中,而仅使用内联脚本来轻松实现此目的。初始化变量(如果需要,在字符串文字中转义&
/ <
到\x26
/ \x3C
)。
当浏览器将标记视为XML时:
<script>
<![CDATA[
...code...
]]>
</script>
当浏览器将标记视为HTML时:
<script>
...code...
</script>
当浏览器将标记视为HTML并且您希望您的XHTML 1.0标记(例如)进行验证时。
<script>
//<![CDATA[
...code...
//]]>
</script>
/* ... */
因为否则,如果删除了换行符,则代码将中断
HTML解析器将把之间的一切<script>
,并</script>
作为脚本的一部分。有些实现甚至不需要正确的结束标记。他们在“ </
” 处停止了脚本解释,这根据规格是正确的。
在HTML5中更新,并且在当前的浏览器中,情况不再如此。
因此,在HTML中,这是不是可能:
<script>
var x = '</script>';
alert(x)
</script>
一个CDATA
部分根本没有效果。这就是为什么你需要写
var x = '<' + '/script>'; // or
var x = '<\/script>';
或类似。
这也适用于用作 text/html
。(由于IE不支持XML内容类型,因此大多数情况都是这样。)
在XML中,适用不同的规则。请注意,(非IE)浏览器仅在XHMTL文档带有XML内容类型时才使用XML解析器。
对于XML解析器,script
标记并不比其他任何标记都要好。特别地,脚本节点可以包含由“ <
” 触发的非文本子节点。“ &
”符号表示字符实体。
所以,在XHTML,这是不是可能:
<script>
if (a<b && c<d) {
alert('Hooray');
}
</script>
要解决此问题,您可以将整个脚本包装在一个CDATA
部分中。这告诉解析器:“在本节中,请勿将“ <
”和“ &
”视为控制字符。为了防止JavaScript引擎解释“ <![CDATA[
”和“]]>
”标记,可以将它们包装在注释中。
如果您的脚本中不包含任何“ <
”或“ &
”,则CDATA
无论如何都不需要节。
</
内部脚本标记都是不好的。
<script>var b = "<b>bold</b>";</script>
无法验证,但是在阅读了您的答案并更改为<script>var b = "<b>bold<\/b>";</script>
固定问题之后。
基本上是允许编写XHTML和HTML的文档。问题是在XHTML中,XML解析器将解释script标记中的&,<,>字符,并导致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。
难道不是在HTML4使用CDATA,但你应该在XHTML使用CDATA和必须,如果你有一个像<和>转义符号使用CDATA在XML。
它可以确保当您的页面中而不是外部引用中嵌入JavaScript时,XHTML验证可以正常工作。
XHTML要求您的页面严格遵守XML标记要求。由于JavaScript可能包含具有特殊含义的字符,因此必须将其包装在CDATA中以确保验证不会将其标记为格式错误。
使用网络上的HTML页面,您只需在和标记之间包含所需的JavaScript。当您验证网页上的HTML时,JavaScript内容被视为CDATA(字符数据),因此验证器将其忽略。如果您在设置网页时遵循最新的XHTML标准,则情况并非如此。使用XHTML时,脚本标记之间的代码被认为是PCDATA(解析的字符数据),因此由验证器处理。
因此,您不能只在页面的脚本标签之间包含JavaScript而不会“破坏”您的网页(至少就验证器而言)。
您可以在此处了解有关CDATA的更多信息,并在此处了解有关XHTML的更多信息。
CDATA指示其中的内容不是XML。
这是维基百科的解释
CDATA在任何XML方言中都是必需的,因为XML节点内的文本在被评估为JavaScript之前被视为子元素。这也是JSLint抱怨正则<
表达式中的字符的原因。
参考文献
当您希望它进行验证时(使用XML / XHTML-谢谢Loren Segal)。