在脚本标签中,何时需要CDATA部分?
CDATA标签在脚本标签中是否有必要,如果是的话?
换句话说,何时何地:
<script type="text/javascript"> //<![CDATA[ ...code... //]]> </script>
更可取的是:
<script type="text/javascript"> ...code... </script>
如果需要将文档parsing为XML(例如,当将XHTML页面解释为XML), 并且希望能够写入文本i<10
和a && b
而不是i<10
和a && b
a && 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 > 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代码和页面不会中断。
向后兼容。 得爱它。