2

我一直在阅读 DOM 文档,似乎在新标准中,CDATA 部分的节点类型现在已经消失了。

似乎Mozilla已经摆脱了它,CDATA_SECTION_NODE因为它现在已被弃用。现在在DOM文档中它说它是历史的。我的问题是:如果现在该函数nodeType没有检测到CDATA_SECTION_NODEDOM 是如何处理这些标签的?那就是如果我要写

<script><![CDATA[ /*Some code with < & and what not */ ]]></script>

那么如果没有节点来处理 CDATA 部分,浏览器将如何处理呢?它只是读取内容并忽略<!CDATA[and]]>字符串吗?

此外,是否有任何地方可以解释摆脱它的决定?

4

1 回答 1

1

CDATA 处理有几个不同的组件:

  1. CDATA 是 DOM 中不同的节点类型(CDATASection带有Node.CDATA_SECTION_NODE nodeType的接口)还是只是一个 Text 节点。
  2. (HTML 或 XML)解析器如何处理包含的标记<!CDATA[ ... ]]>——它如何处理 CDATA 中的特殊字符 ( <>&),它是否为 CDATA 部分发出单个节点,如果是,它Text是否CDATASection在DOM。
  3. 如何对 CDATA 部分进行序列化(包裹在特殊字符中<![CDATA[ ]]>或转义特殊字符)

据我所知,#2 HTML5 解析器规范在大多数浏览器中实现,根据它,解析器从不发出 CDATASection 节点,具体取决于上下文

  • 要么将 CDATA 的内容解析为“原始文本”(特殊字符的处理方式不同) - 例如在<script>or<math>
  • 或将 CDATA 视为“虚假评论”,以第一个>.

CDATA 应该如何以及是否应该在 DOM 中公开的问题尚未达成一致,尽管已从 DOM4 规范中删除,但它至少在 Gecko 中仍然可用(请参阅Mozilla 错误 660660、W3C 错误1284127386)。

  • 一方面,从使用 DOM 的应用程序的角度来看,CDATA 节点与文本节点没有太大区别——唯一的区别是它们在标记中的序列化。因此,如果 CDATA 作为单独的节点类型公开,则每个人都需要记住,在他们想要检查文本节点的任何时候都要检查它。
  • 另一方面,失去将文档的某些部分序列化为 CDATA 的能力会使创作工具的开发人员和用户感到不安,因为它会强制序列化始终对 XML/HTML 的特殊字符进行编码。
于 2016-12-25T15:28:50.797 回答