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

Roy*_*mir 3 html asp.net cdata

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

这家伙在这里说:

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

Question #1

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

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

// ]]>
</script> 
Run Code Online (Sandbox Code Playgroud)

Question #2

为什么它是一个评论?(//)

Alo*_*hci 8

XHTML应该通过使用媒体类型作为XML提供application/xhtml+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[//]]>模式是一种非常有效的技术.

  • 我认为这里的关键点是XML注释以"<! - "开头,以" - >"结尾,而JavaScript注释以"/*"开头,以"*/"结尾或以"//"开头并以回车或换行结束.因此实际上这些行在JavaScript中注释掉,但在XML中没有注释.因此,XML引擎仍然识别"<![CDATA ["和"]]>"并让它们正常工作,转义可能出现在JS中的其他保留字符(如Alohci解释的那样).这是一种奇怪的酷感:D (3认同)