为什么CDATA在脚本标签下被注释掉了?

时间:2013-05-05 07:41:48

标签: asp.net html cdata

我正在阅读此question,我有一个相关的问题:

这个人here说:

  

它用于脚本标记以避免解析<和&amp ;.在HTML中,这是   不需要,因为在HTML中,脚本已经 #CDATA。

问题#1

如果SCRIPT 已经 #CDATA:为什么它仍然作为CDATA渲染(在脚本标记下)?

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

// ]]>
</script> 

问题#2

为什么要作为评论? (//

1 个答案:

答案 0 :(得分:8)

XHTML应该使用媒体类型application/xhtml+xml作为XML提供。在HTML5中,如果标记是使用XML媒体类型提供的,则标记仅为 XHTML。如果这样提供,脚本元素的内容是 CDATA。

因此,为了让XML解析器将脚本内容视为CDATA,可以将它们包装在<![CDATA[ ]]>中。

虽然历史上很少有人将标记服务为application/xhtml+xml,但很多人已将其网页验证为XHTML。 XHTML验证器同样期望脚本内容通常不是CDATA,因此通常会拒绝嵌入在JavaScript中的标记和其他标记碎片,除非它们使用<![CDATA[ ]]>进行转义

将页面验证为XHTML后,他们会向浏览器提供text/html媒体类型的页面,这意味着浏览器会将标记视为HTML,而不是XHTML。在这种情况下,使用HTML解析器, 自动将脚本内容视为CDATA,因此<![CDATA[]]>。成为JavaScript引擎运行的脚本的一部分。因此,要从JavaScript引擎隐藏这些字符串,它们在同一行上以//开头,这意味着JavaScript引擎认为这些行是注释。

最后,有些人提供与application/xhtml+xmltext/html相同的标记,根据HTTP请求消息中的信息进行切换。出于与上述相同的原因,为了在两种模式下正确处理脚本内容,//<![CDATA[//]]>模式是一种非常有效的技术。