【问题标题】:CDATA Section Node deprecated in DOM4DOM4 中不推荐使用 CDATA 节节点
【发布时间】:2013-05-26 10:26:59
【问题描述】:

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

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

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

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

此外,有什么地方可以解释摆脱它的决定吗?

【问题讨论】:

  • 自己试试吧。创建一个元素,向其添加 CDATA 内容,并遍历其子元素,检查节点类型和值
  • @Ian:我已经在 Firefox 中测试过,似乎&lt;! &gt; 中的所有内容在查看 HTML 文件时都被视为“虚假”注释。但令人惊讶的是,如果我将 cdata 部分放在 xml 文档中,那么在检查元素时,我发现它检测到了 cdata-section 节点。我不太确定在读取包含该节点的 xml 文件时 javascript 会说什么。感谢您的建议。
  • CDATA 是特定于 SGML 和 XML 的,它在 HTML 中是无效的,而且从来都不是,所以它作为“虚假”评论出现是正确和预期的行为,因为“正确”评论有&lt;!----&gt;。但是,我仍然对到底发生了什么变化感到困惑。例如,如果新的 DOM4 中没有 CDATA,但 XML 中仍然存在 CDATA 标签,那么一旦 Mozilla 淘汰并移除 DOM 支持,我们将如何处理数据? IE。寻找 NodeFilter.SHOW_CDATA_SECTION 的 tree walker 会失败吗?那么我们如何找到它们呢?它现在才有效,因为它还没有过时/删除。
  • 我假设 CDATA 被视为与任何其他文本节点(或文本节点的一部分)一样
  • 我在浏览器中从本地文件系统打开了一些 &lt;outertag&gt;&lt;tags&gt;&lt;innertag&gt;&lt;!CDATA[&lt;p&gt;some HTML etc&lt;/p&gt;]]&gt;&lt;/innertag&gt;&lt;/tags&gt;[more &lt;tags&gt; here]&lt;/outertag&gt; 形式的 XML。在浏览器控制台 (CTRL-k) 中:JS DOM document.createTreeWalker( document, NodeFilter.SHOW_TEXT, null ); 然后这个 &lt;tags&gt;.textContent 显示 HTML。或者这个&lt;tags&gt;.childNode[0].nodeValue 有HTML。但是如果childNode[0]CDATASection 节点,那么在DOM4 中究竟删除了什么?我以为 CDATASection 节点会被删除? FF 49 还没有使用 DOM4 吗?还是尚未删除?什么时候下架?

标签: javascript html xml dom w3c


【解决方案1】:

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

  1. CDATA 是 DOM 中的一个独特节点类型(CDATASection 接口与 Node.CDATA_SECTION_NODEnodeType)还是只是一个文本节点。
  2. (HTML 或 XML)解析器如何处理包含 &lt;!CDATA[ ... ]]&gt; 的标记——它如何处理 CDATA 中的特殊字符 (&lt;&gt;&amp;),它是否为 CDATA 部分发出单个节点,如果是的话它会在 DOM 中创建一个 Text 节点或 CDATASection 节点。
  3. 如何对 CDATA 部分进行序列化(包装在 &lt;![CDATA[ ]]&gt; 中或转义特殊字符)

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

  • 要么将 CDATA 的内容解析为“原始文本”(特殊字符的处理方式不同),例如在&lt;script&gt;&lt;math&gt;
  • 或将 CDATA 视为“虚假评论”which ends at the first &gt;

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

  • 一方面,从使用 DOM 的应用程序的角度来看,CDATA 节点与文本节点没有太大区别——唯一的区别是它们在标记中的序列化。因此,如果 CDATA 作为单独的节点类型公开,则每个人都需要记住在他们想要检查文本节点时随时检查它。
  • 另一方面,由于 CDATA 导致无法序列化文档的某些部分,这会让创作工具的开发人员和用户感到不安,因为它会强制序列化始终对 XML/HTML 特有的字符进行编码。

【讨论】:

    猜你喜欢
    • 2015-05-04
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 2011-12-25
    • 2014-12-26
    • 2023-03-21
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多