<script type="text/javascript">
//<![CDATA[
...code...
//]]>
</script>
更可取this:
<script type="text/javascript">
...code...
</script>
#1 楼
如果您需要将文档解析为XML(例如,将XHTML页面解释为XML),并且希望能够编写文字i<10
和a && b
而不是i<10
和a && b
,则需要CDATA部分,因为XHTML会解析JavaScript代码作为解析的字符数据,而不是默认情况下的字符数据。这不是存储在外部源文件中的脚本的问题,但是对于XHTML中的任何内联JavaScript,您可能都想使用CDATA部分。请注意,许多XHTML页面从不打算解析为XML,在这种情况下就不会有问题。
有关此主题的出色文章,请参阅https://web.archive.org/web/20140304083226/http://javascript。 about.com/library/blxhtml.htm
评论
除了“验证”之外,还有很多其他功能。如果最严格的XML解析器遇到非法字符,则不会浏览该页面。这不仅仅是让W3C开心起来,变得绿色而不是红色。
–劳伦·西格尔(Loren Segal)
08/09/15在20:58
如果避免使用&和<字符,则不需要CDATA部分。在HTML和XHTML中都可以正常工作。您可以通过将所有重要的代码放入外部脚本中,而仅使用内联脚本来轻松实现此目的。初始化变量(如果需要,将&/ <转义为字符串文字中的\ x26 / \ x3C)。
– bobince
09年9月20日在9:10
如果是HTML5,该怎么办?
–马修·艾德礼(Mathew Attlee)
09年12月2日,11:44
@Mathew Attle-这是一个很好的问题。在一个单独的线程上提出一个很好的问题,以确保它获得所需的关注。
– Alex KeySmith
2010年11月6日,19:01
@Loren:那仍然完全是关于验证的。用户代理拒绝无效XML的程度是正交的。
–轨道轻度竞赛
2011年6月9日18:09
#2 楼
当浏览器将标记视为XML时:<script>
<![CDATA[
...code...
]]>
</script>
当浏览器将标记视为HTML时:
<script>
...code...
</script>
当浏览器将标记视为HTML且您希望您的XHTML 1.0标记(例如)通过验证时。
<script>
//<![CDATA[
...code...
//]]>
</script>
评论
出于代码安全的考虑,最好将CDATA用块注释/ * ... * /括起来,因为否则,如果删除了换行符,代码将中断
– BryanH
2015年11月3日在20:05
第一部分中的“ ...作为XML”不应该是“ ...作为未解释的文本”吗?在stackoverflow.com/questions/2784183/what-does-cdata-in-xml-mean中,我们看到“ ...这些字符串包括可以解释为XML标记的数据,但不应如此。”
–马特·威尔基
17年1月31日在20:38
@mattwilkie,我所说的“作为XML”是“当浏览器使用其XML解析器(而不是HTML解析器)来解析标记时,因为文档是使用基于XML的mime类型发送的,或者包含标记的文件具有基于XML的文件扩展名”。
–Shadow2531
17年2月1日在12:07
#3 楼
HTMLHTML解析器会将
<script>
和</script>
之间的所有内容都视为脚本的一部分。有些实现甚至不需要正确的结束标记。他们会在“ </
”处停止脚本解释,这根据规范是正确的。 Update在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)浏览器仅在XHMTL文档带有XML内容类型时才使用XML解析器。对于XML解析器,
script
标记并不比任何其他标记都要好。特别地,脚本节点可以包含非文本子节点,由“ <
”触发; 因此,在XHTML中,这是不可能的:
<script>
if (a<b && c<d) {
alert('Hooray');
}
</script>
要解决此问题,您可以将整个脚本包装在
&
部分中。这告诉解析器:“在本节中,请勿将“ CDATA
”和“ <
”视为控制字符。为防止JavaScript引擎解释“ &
”和“ <![CDATA[
”标记,可以将它们包装在注释中。如果脚本中不包含任何“
]]>
”或“ <
”,则不要仍然需要一个&
部分。评论
对于(建议的)HTML5来说,“ CDATA节根本没有任何作用”的说法是不正确的,它可以识别该构造。 w3.org/TR/html5/syntax.html#cdata-sections
–丹诺顿
2012年3月6日在20:29
@danorton有趣。我认为这很丑陋。虽然在脚本内容上仍然没有效果。
–user123444555621
2012年3月6日22:06
不知道脚本标记内的任何标记都是不好的。
–萨拉曼A
13年5月5日在18:38
@SalmanA这是HTML的怪异之一,正式称为ETAGO。了解更多信息:mathiasbynens.be/notes/etago(尽管文章指出,没有浏览器实现过该功能,但我敢肯定,这会给我造成麻烦。也许在其他工具中)
–user123444555621
13年5月5日在20:35
实际上,我遇到了验证问题-
评论
现在XHTML已经基本失效,这不再是一个相关问题了吗?@allyourcode:是什么让您认为XHTML已死? HTML5?还有XHTML5可以一起使用:)
@DoktorJ AFAIK xHTML的版本为1。与HTML等效的版本为版本4。xHTML2.0集中了一项工作,旨在将xform,xlink,time和svg命名空间推入规范,以改进与HTML 5相同的功能。添加-xform / input-validation,时间/动画,svg /画布-但针对xHTML 2规范的工作重新集中在HTML 5功能上。这并不是说xHTML 2被丢弃或已过时,但它并没有在不久的将来进行计划。
XHTML尚未在Java Seam / JSF / Facelets开发中消失。
@Mihai Stancu-并不完全正确。根据W3C的说法,HTML5有一种XML语法:“可用于HTML5的另一种语法是XML。该语法与XHTML1文档和实现兼容。使用该语法的文档必须与XML媒体类型一起使用,并且元素需要遵循XML规范规定的规则放在w3.org/1999/xhtml命名空间中。”