脚本标记中何时需要CDATA部分?

bra*_*rad 887 html javascript xhtml cdata

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

换句话说,何时何地:

<script type="text/javascript">
//<![CDATA[
...code...
//]]>
</script>
Run Code Online (Sandbox Code Playgroud)

比这更好:

<script type="text/javascript">
...code...
</script>
Run Code Online (Sandbox Code Playgroud)

Mic*_*ley 577

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

请注意,许多XHTML页面从未打算被解析为XML,在这种情况下,这不会是一个问题.

有关该主题的优秀文章,请参阅http://javascript.about.com/library/blxhtml.htm

  • 除了"验证"之外,还有很多其他内容.如果遇到非法字符,大多数严格的XML解析器都不会通过该页面.它不仅仅是让W3C变得快乐而变得绿色而不是红色. (48认同)
  • 如果避免使用`&`和`<`字符,则不需要CDATA部分; 它在HTML和XHTML中都能正常工作.您可以通过将所有重要代码放在外部脚本中并仅使用内联脚本来轻松实现此目的.初始化变量(如果需要,可以在字符串文字中转义`&`/`<`到`\ x26` /`\ x3C`). (40认同)
  • 那么HTML5呢? (23认同)
  • @Mathew Attle - 这是一个很好的问题.在一个单独的线程上提出一个很好的问题,以确保它获得所需的关注. (5认同)
  • html5不是xhtml,感谢上帝,所以这不是必需的 (5认同)
  • @Loren:然后它仍然完全是关于验证.用户代理拒绝无效XML的程度是正交的. (3认同)
  • @chief:错误,html5包含一个xhtml方言,通过使用xhtml mime类型提供(对于本地文件,即.xhtml文件结尾) (3认同)
  • @Mathew Attlee:根据W3C,[有HTML5的XML语法](http://www.w3.org/TR/html5-diff/#syntax).使用XML语法时,情况将是相同的. (2认同)
  • @CoffeeAddict字符数据是纯文本.像`</ script>`这样的东西按原样使用.解析的数据被解析为HTML(或XML):``&quot; </ script>`被解释为```然后解析器停止解析,因为它遇到了结束标记. (2认同)
  • 关于 XHTML 已死的许多评论具有误导性,因为还有各种其他常见的 XML 格式,其中一些实际上是 HTML5 的一部分。例如,您仍然需要 CDATA 作为 SVG 内的脚本元素,因为 SVG 是 XML。 (2认同)

Sha*_*531 231

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

<script>
<![CDATA[
    ...code...
]]>
</script>
Run Code Online (Sandbox Code Playgroud)

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

<script>
    ...code...
</script>
Run Code Online (Sandbox Code Playgroud)

当浏览器将标记视为HTML并且您希望XHTML 1.0标记(例如)进行验证时.

<script>
//<![CDATA[
    ...code...
//]]>
</script>
Run Code Online (Sandbox Code Playgroud)

  • 就代码安全而言,最好用块注释`/*...*/`包围你的CDATAs,否则如果删除换行符,代码就会破坏 (10认同)

use*_*621 124

HTML

HTML解析器将处理脚本之间的所有内容<script>并将其</script>作为脚本的一部分.有些实现甚至不需要正确的结束标记; 他们停止脚本解释为" </",根据规格是正确的.

更新在HTML5和当前浏览器中,情况不再如此.

因此,在HTML中,这是不是可能:

<script>
var x = '</script>';
alert(x)
</script>
Run Code Online (Sandbox Code Playgroud)

CDATA节完全没有效果.这就是你需要写作的原因

var x = '<' + '/script>'; // or
var x = '<\/script>';
Run Code Online (Sandbox Code Playgroud)

或类似的.

这也适用于作为的XHTML文件text/html.(由于IE不支持XML内容类型,因此大多数情况都是如此.)

XML

在XML中,适用不同的规则.请注意,如果XHMTL文档以XML内容类型提供,则(非IE)浏览器仅使用XML解析器.

对于XML解析器,script标记并不比任何其他标记更好.特别地,脚本节点可以包含由" <" 触发的非文本子节点; 并且" &"符号表示字符实体.

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

<script>
if (a<b && c<d) {
    alert('Hooray');
}
</script>
Run Code Online (Sandbox Code Playgroud)

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

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

  • @SalmanA这是HTML的奇怪之处,官方称为*ETAGO*.了解更多:http://mathiasbynens.be/notes/etago(虽然文章指出没有浏览器曾经实现过这个功能,我很确定它给我带来了一些麻烦.也许在其他一些工具中) (3认同)
  • 声明"CDATA部分完全没有效果"并不适用于(建议的)HTML5,它识别构造.http://www.w3.org/TR/html5/syntax.html#cdata-sections (2认同)
  • @danorton很有意思.我认为这是一个非常丑陋的组合.但是对脚本内容仍然没有影响. (2认同)
  • 不知道脚本标签内的_any_`&lt;/` 是坏的。 (2认同)

ond*_*dra 30

基本上它是允许编写既是XHTML又是HTML的文档.问题是在XHTML中,XML解析器将解释脚本标记中的&,<,>字符并导致XML解析错误.因此,您可以使用实体编写JavaScript,例如:

if (a &gt; b) alert('hello world');
Run Code Online (Sandbox Code Playgroud)

但这是不切实际的.更大的问题是,如果您在HTML中读取页面,标签脚本将被视为"默认情况下"CDATA,并且此类JavaScript将无法运行.因此,如果您希望同一页面都可以使用XHTML和HTML解析器,则需要将脚本标记包含在XHTML中的CDATA元素中,但不要将其包含在HTML中.

这个技巧标志着CDATA元素作为JavaScript注释的开始; 在HTML中,JavaScript解析器忽略CDATA标记(它是注释).在XHTML中,XML解析器(在JavaScript之前运行)检测到它并将其余部分视为CDATA结束为CDATA.


Fra*_*anz 23

这是一个X(HT)ML的事情.当您在JavaScript中使用符号<和符号时>,例如,为了比较两个整数,这必须像XML一样进行解析,因此它们将标记为标记的开头或结尾.

CDATA意味着以下行(所有内容]]>都不是XML,因此不应该这样解析.


Lor*_*gal 18

难道不是在HTML4使用CDATA,但你应该在XHTML使用CDATA和必须,如果你有一个像<和>转义符号使用CDATA在XML.

  • CDATA在HTML4中无效.简单地说,它不是语法的一部分.CDATA是XML的语法,XHTML是XML子集.因此,它应该只在XML(及其子集)中使用.另一方面,HTML不是XML. (11认同)
  • 为什么不在HTML4中呢? (2认同)

LBu*_*kin 17

当您在页面中嵌入JavaScript而不是外部引用时,它可以确保XHTML验证正常工作.

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

使用网页上的HTML页面,您可以在标签之间包含所需的JavaScript.在网页上验证HTML时,JavaScript内容被视为CDATA(字符数据),因此验证程序会忽略它.如果您在设置网页时遵循最新的XHTML标准,则情况并非如此.使用XHTML,脚本标记之间的代码被认为是PCDATA(解析的字符数据),因此由验证器处理.

因此,您不能只在页面上的脚本标记之间包含JavaScript而不会"破坏"您的网页(至少就验证程序而言).

您可以在此处了解有关CDATA的更多信息,以及有关XHTML的更多信息.


Ale*_*ley 10

CDATA表示其中的内容不是XML.

这是对维基百科的解释


Chr*_*fer 9

当您要求严格的XHTML合规性时,您需要CDATA,并且&rsands不会被标记为无效字符.


geh*_*kky 8

在xhtml验证期间避免xml错误.


Ika*_*aso 8

CDATA告诉浏览器按原样显示文本,而不是将其呈现为HTML.


小智 6

CDATA表示其中的内容不是XML.


Pau*_*tte 5

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

参考