2013-05-05 81 views
3

我读这个question,我有一个相关的问题:为什么CDATA在脚本标记下被注释掉了?

这家伙here说:

它在脚本标签是用来避免解析<和&。在HTML中,这是不需要的 ,因为在HTML中,脚本已经是 #CDATA。

问题#1

如果脚本已经 #CDATA:为什么它renderd(下脚本标签)仍CDATA?

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

// ]]> 
</script> 

问题2

为什么它作为一个评论? (//

+0

它被注释掉,否则你会得到一个JS语法错误。我目前没有看到CDATA在HTML脚本标记中被大量使用,并且不会自己使用它。也许是从XHTML的日子开始的,因为CDATA是一个XML构造,而XHTML使用了许多XML的规则。 – Netricity 2013-05-05 08:15:26

回答

8

XHTML应该通过使用媒体类型application/xhtml+xml作为XML提供。在HTML5中,标记仅为 XHTML(如果使用XML媒体类型)。当像这样服务时,脚本元素的内容是而不是 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[//]]>模式是非常有效的技术。

+3

我认为这里的关键点在于,XML注释以“<! - ”开头并以“ - >”结尾,而JavaScript注释以“/ *”开头并以“* /”结尾或以“//开头”开头“并以回车或换行结束。所以实际上这些行在JavaScript中注释掉,但不在XML中注释。因此,XML引擎仍然可以识别“<![CDATA [”和“]]>”,并让它们像平常一样工作,转义可能出现在JS中的保留字符(正如Alohci解释的那样)。这是那些奇妙的冷静宝石之一:D – CommaToast 2014-07-03 21:27:59