根据 www.w3.org/TR/xhtml1/#h-4.8,CDATA 部分可以定义为:[no //]
是的。在 XHTML 中,它们可以。正确的 XHTML,由 XML 解析器读取,例如当您将 application/xhtml+xml 提供给非 IE 的 Web 浏览器时。
但可能您实际上是在充当text/html,这意味着您的浏览器不是该部分中提到的“XML 处理器”。这是一个遗留的 HTML4 解析器,因此您必须遵守 appendix C guidelines 并避免任何在 HTML4 中不起作用的 XML 功能。
特别是,<script> 或 <style> 块中的字符串 <![CDATA[ 和 ]]> 对于 HTML4 解析器来说并不特殊,因为在 HTML4 中,这两个元素是不适用标记的“CDATA 元素” (除了 </ ETGO 序列来结束元素本身)。因此 HTML4 解析器会将这些字符串直接发送到 CSS 或 JavaScript 引擎。
因为<![CDATA[ 不是有效的JS,你会得到一个JavaScript 语法错误。 (这里的其他答案是错误的:它不仅仅是非常旧的浏览器,而是所有 HTML4 浏览器,这会给脚本中未注释的 CDATA 部分带来错误。)
您使用// 或/* 注释标记来隐藏JavaScript 或CSS 引擎的内容。所以:
<script type="text/javascript">//<![CDATA[
alert('a&b');
//]]></script>
(注意前面的//;这在 W3Schools 示例代码中被省略了,这使得该示例代码根本不起作用。失败。不要相信 W3Schools:它们与 W3C 无关,而且它们的材料通常是垃圾。)
HTML 解析器将其读取为:
- 打开标签
script 建立 CDATA 内容直到下一个 ETGO
- 文字
//<![CDATA[\n alert('a&b');\n//]]>
- ETGO 和关闭标签
script
- -> 将结果内容发送到 JavaScript 引擎:
//<![CDATA[\nalert('a&b');\n//]]>
但通过 XML 解析器为:
- 打开标签
script(无特殊解析含义)
- 文字内容
//
- 打开 CDATA 部分,建立 CDATA 内容直到下一个
]]> 序列
- 文字
\n alert('a&b');\n//
- 关闭 CDATA 部分
- 关闭标签
script
- -> 将结果内容发送到 JavaScript 引擎:
//\nalert('a&b');\n//
虽然解析过程完全不同,但 JS 引擎在每种情况下都会得到相同的有效代码,因为有了//s,唯一的区别在于 cmets。
请注意,这与老式的情况截然不同:
<script type="text/javascript"><!--
alert('a&b');
//--></script>
这是为了隐藏脚本/样式内容,这样它就不会被写入不理解<script> 和<style> 标签的浏览器的页面上。这不会产生 JavaScript/CSS 错误,因为 hack 将其置于不同的级别:它是 CSS 和 JavaScript 语言的语法特性它们自己,<!-- 被定义为什么都不做,允许这个黑客工作。
那些浏览器是古老的历史;你今天绝对不应该使用这种技术。尤其是在 XHTML 中,XML 解析器会按照您的要求将整个脚本块转换为 XML 注释而不是可执行代码。
我想在不转义特殊字符的情况下将脚本或 CSS 内联到 xHTML。
避免这样做,你会更快乐。
您真的需要<style> 中的< 和& 字符吗?不,几乎从来没有。你真的需要他们<script>吗?嗯...有时,是的,在这种情况下,commented-CDATA-section 是可以接受的。
但老实说,XHTML 兼容性指南 C.4 对 HTML4 和对 XHTML1 一样适用:任何重要的东西都应该是外部脚本,然后您就不必担心这些了。