8

昨天我卷入了关于 DOM 实现怪癖的讨论,引发了一个关于 Text.splitText 和 Element.normalise 行为以及它们应该如何表现的有趣问题。

DOM Level 1 Core中,Text.splitText 被定义为...

在指定的偏移量处将此 Text 节点拆分为两个 Text 节点,将它们作为兄弟节点保留在树中。然后,该节点仅包含直到偏移点的所有内容。并且作为该节点的下一个兄弟插入的新文本节点包含偏移点处和之后的所有内容。

标准化是...

将所有 Text 节点放在此 Element 下的子树的全部深度中,形成“正常”形式,其中只有标记(例如,标签、注释、处理指令、CDATA 部分和实体引用)分隔 Text 节点,即有没有相邻的文本节点。这可用于确保文档的 DOM 视图与保存和重新加载时相同,并且在要使用依赖于特定文档树结构的操作(例如 XPointer 查找)时很有用。

因此,如果我采用 textNode 中引用的包含“Hello World”的文本节点,然后执行

textNode.splitText(3)

textNode 现在有内容“Hello”,以及一个包含“World”的新兄弟

如果我那时

textNode.parent.normalize()

什么是文本节点?规范没有明确说明 textNode 必须仍然是其先前父节点的子节点,只是更新为包含所有相邻的文本节点(然后将其删除)。删除所有相邻的文本节点似乎是一种一致的行为,然后用值的连接重新创建一个新节点,让 textNode 指向不再是树的一部分的东西。或者,我们可以以与 splitText 相同的方式更新 textNode,因此它保留它的树位置,并获取一个新值。

行为的选择确实完全不同,我找不到关于哪个是正确的澄清,或者这只是规范中的疏忽(似乎在第 2 级或第 3 级中没有澄清)。那里的任何 DOM/XML 专家都可以提供一些启示吗?

4

3 回答 3

5

早期我在 DOM 工作组;我确定我们的意思是让 textNode 包含新的连接值,但如果我们没有在规范中说明,那么某些实现可能会创建一个新节点而不是重用 textNode,尽管这需要更多的工作实施者。

如有疑问,请进行防御性编程。

于 2008-09-05T13:51:00.943 回答
2

虽然这似乎是一个合理的假设,但我同意规范中没有明确说明。我可以补充的是,我阅读它的方式,其中一个textNode或它的新兄弟(即从 的返回值splitText)将包含新的连接值 - 该语句指定子树中的所有节点都以正常形式放置,而不是子树被规范化为一个新的结构。我想唯一安全的事情是在规范化之前保留对父级的引用。

于 2008-08-29T08:52:14.900 回答
2

我认为所有的赌注都在这里了;我当然不会依赖任何给定的行为。唯一安全的做法是再次从其父节点获取节点。

于 2008-09-05T13:34:43.790 回答