我昨天卷入了关于DOM实现怪癖的讨论,引发了一个关于Text.splitText和Element.normalise行为以及它们应该如何表现的有趣问题。
在DOM Level 1 Core中,Text.splitText被定义为......
将此Text节点分解为指定偏移量的两个Text节点,将两者保留在树中作为兄弟节点。然后,该节点仅包含直到偏移点的所有内容。并且作为此节点的下一个兄弟插入的新Text节点包含偏移点处和之后的所有内容。
标准化是......
将此Element下面的子树的完整深度中的所有Text节点放入“正常”形式,其中只有标记(例如,标记,注释,处理指令,CDATA部分和实体引用)将Text节点分开,即,没有相邻的Text节点。这可用于确保文档的DOM视图与保存和重新加载文档的DOM视图相同,并且在使用依赖于特定文档树结构的操作(例如XPointer查找)时非常有用。
因此,如果我采用包含“Hello World”的文本节点,在textNode中引用,并执行
textNode.splitText(3)
textNode现在具有内容“Hello”,以及包含“World”
的新兄弟如果我那么
textNode.parent.normalize()
什么是textNode ?该规范没有明确表示textNode仍然是它的前一个父节点的子节点,只是更新为包含所有相邻的文本节点(然后被删除)。它似乎是一个删除所有相邻文本节点的一个conforment行为,然后重新创建一个具有值的串联的新节点,使textNode指向不再是树的一部分的东西。或者,我们可以以与splitText相同的方式更新textNode,因此它保留了它的树位置,并获得了一个新值。
行为的选择实际上是完全不同的,我无法找到关于哪个是正确的澄清,或者这只是规范中的疏忽(在2级或3级似乎没有澄清) 。任何DOM / XML专家都可以解决这个问题吗?
答案 0 :(得分:4)
我早期在DOM工作组工作;我确定我们意味着 for textNode包含新的连接值,但是如果我们在规范中没有说它,则可能一些 implementation 可能创建一个新节点而不是重用textNode,但这需要为实现者做更多的工作。
如有疑问,请采取防御措施。
答案 1 :(得分:1)
虽然这似乎是一个合理的假设,但我同意在规范中没有明确说明。我可以添加的是我读它的方式,textNode
之一或它的新兄弟(即来自splitText
的返回值)将包含新的连接值 - 该语句指定所有节点 以正常形式放置,而不是将子树标准化为新结构。我想唯一安全的做法是在规范化之前保留对父级的引用。
答案 2 :(得分:1)
我认为所有的赌注都在这里;我当然不会依赖任何给定的行为。唯一安全的做法是再次从其父节点获取节点。