在脚本标签中,何时需要CDATA部分?

CDATA标签在脚本标签中是否有必要,如果是的话?

换句话说,何时何地:

<script type="text/javascript"> //<![CDATA[ ...code... //]]> </script> 

更可取的是:

 <script type="text/javascript"> ...code... </script> 

如果需要将文档parsing为XML(例如,当将XHTML页面解释为XML), 并且希望能够写入文本i<10a && b而不是i&lt;10a &amp;&amp; b a &amp;&amp; b ,因为默认情况下,XHTML会将JavaScript代码parsing为经过分析的字符数据,而不是字符数据。 这不是存储在外部源文件中的脚本的问题,但对于XHTML中的任何内联JavaScript,您可能需要使用CDATA部分。

请注意,许多XHTML页面从来没有打算被parsing为XML,在这种情况下,这不会是一个问题。

关于这个问题的一个很好的写法,请参阅http://javascript.about.com/library/blxhtml.htm

当浏览器将标记视为XML时:

 <script> <![CDATA[ ...code... ]]> </script> 

当浏览器将标记视为HTML时:

 <script> ...code... </script> 

当浏览器将标记视为HTML,并且希望validation您的XHTML 1.0标记(例如)时。

 <script> //<![CDATA[ ...code... //]]> </script> 

HTML

HTMLparsing器将把<script></script>之间的所有内容作为</script>一部分。 一些实现甚至不需要正确的结束标记; 他们停止脚本解释在“ </ ”,根据规格是正确的 。 [更新]在HTML5和目前的浏览器,情况不再是这样了。[/更新]

所以,在HTML中,这是不可能的:

 <script> var x = '</script>'; alert(x) </script> 

CDATA部分根本没有任何作用 。 这就是为什么你需要写

 var x = '<' + '/script>'; // or var x = '<\/script>'; 

或类似的。

这也适用于以text/html格式提供的XHTML文件。 (因为IE不支持XML内容types,所以大部分都是这样。)

XML

在XML中,适用不同的规则。 请注意,如果XHMTL文档是以XML内容types提供的,则(非IE)浏览器仅使用XMLparsing器。

对于XMLparsing器来说, script标记并不比任何其他标记更好。 特别是,脚本节点可能包含由“ < ”触发的非文本子节点。 而“ & ”号表示一个字符实体。

所以,在XHTML中,这是不可能的:

 <script> if (a<b && c<d) { alert('Hooray'); } </script> 

要解决此问题,可以将整个脚本包装在CDATA部分中。 这告诉parsing器:'在本节中, 不要把“ < ”和“ & ”当作控制字符 。 为了防止JavaScript引擎解释“ <![CDATA[ ”和“ ]]> ”标记,可以将它们包装在注释中。

如果您的脚本不包含任何“ < ”或“ & ”,则无论如何您都不需要CDATA部分。

基本上是允许编写一个既是XHTML又是HTML的文档。 问题是,在XHTML中,XMLparsing器将解释脚本标记中的&,<,>字符,并导致XMLparsing错误。 所以,你可以写你的JavaScript的实体,例如:

 if (a &gt; b) alert('hello world'); 

但这是不切实际的。 更大的问题是,如果你阅读HTML中的页面,标签脚本默认被认为是CDATA,这样的JavaScript将不会运行。 因此,如果您希望使用XHTML和HTMLparsing器的相同页面都可以正常运行,则需要将脚本标记封装在XHTML中的CDATA元素中,而不是将其封装在HTML中。

这个技巧将CDATA元素的开始标记为JavaScript注释; 在HTML中,JavaScriptparsing器忽略CDATA标记(这是一个注释)。 在XHTML中,XMLparsing器(在JavaScript之前运行)检测到它,并将剩余的CDATA作为CDATA结束。

这是一个X(HT)ML的事情。 当你在JavaScript中使用像<>这样的符号时,比如说要比较两个整数,这就必须像XML一样被parsing,因此它们会被标记为标记的开始或结束。

CDATA意味着下面的行(所有的东西)不是XML,因此不应该这样parsing。

不要在HTML4中使用CDATA,但是您应该在XHTML中使用CDATA,并且必须在XML中使用CDATA,前提是您使用了<and>等非转义符号。

它确保当您的页面中embedded了JavaScript,而不是外部引用时,XHTMLvalidation能够正确工作。

XHTML要求您的页面严格符合XML标记要求。 由于JavaScript可能包含特殊含义的字符,因此必须将其包装在CDATA中以确保validation不会将其标记为格式错误。

通过网页上的HTML页面,您可以在标签和标签之间添加所需的JavaScript。 当您在网页上validationHTML时,JavaScript内容被认为是CDATA(字符数据),因此validation器将忽略它。 如果您在设置网页时遵循最新的XHTML标准,则情况也是如此。 使用XHTML,脚本标签之间的代码被认为是PCDATA(parsing的字符数据),因此由validation器处理。

正因为如此,您不能在页面上的脚本标记之间包含JavaScript,而不会“破坏”您的网页(至less就validation者而言)。

您可以在这里了解更多有关CDATA的信息 ,以及更多关于XHTML的信息 。

当您要严格遵守XHTML标准时,您需要CDATA小于,并且&符号不会被标记为无效字符。

CDATA表示内部的内容不是XML。

这里是对维基百科的解释

在xhtmlvalidation期间避免xml错误。

CDATA通知浏览器按原样显示文本,而不是将其呈现为HTML。

CDATA表示内部的内容不是XML。

CDATA在任何XML方言中都是必需的,因为XML节点中的文本在被评估为JavaScript之前被视为子元素。 这也是JSLint抱怨正则expression式中的字符的原因。

参考

  • 创build一个声明式的XML UI语言
  • Web的未来:丰富的客户端,丰富的浏览器,丰富的门户网站

当你想要它validation (在XML / XHTML – 谢谢, 罗兰Segal )。

这种方式旧的浏览器不parsing的JavaScript代码和页面不会中断。

向后兼容。 得爱它。