提问人:Adam Wright 提问时间:8/27/2008 最后编辑:Adam Wright 更新时间:12/27/2019 访问量:379
DOM splitText 和 normalize compose 应该给出标识吗?
Should DOM splitText and normalise compose to give the identity?
问:
昨天,我卷入了关于 DOM 实现怪癖的讨论,并提出了一个关于 Text.splitText 和 Element.normalize 行为以及它们应该如何表现的有趣问题。
在 DOM Level 1 Core 中,Text.splitText 被定义为...
在指定的偏移量处将此 Text 节点分解为两个 Text 节点,使这两个节点在树中保持为同级节点。然后,此节点仅包含直到偏移点的所有内容。一个新的 Text 节点作为此节点的下一个同级插入,包含偏移点处和之后的所有内容。
正常化是...
将此元素下子树全深度中的所有 Text 节点放入“正常”形式,其中只有标记(例如,标记、注释、处理指令、CDATA 部分和实体引用)分隔 Text 节点,即没有相邻的 Text 节点。这可用于确保文档的 DOM 视图与保存和重新加载的文档相同,并且在使用依赖于特定文档树结构的操作(如 XPointer 查找)时非常有用。
因此,如果我采用一个包含“Hello World”的文本节点,在 textNode 中引用,然后执行
textNode.splitText(3)
textNode 现在包含内容“Hello”,以及一个包含“World”的新同级
如果我那么
textNode.parent.normalize()
什么是 textNode?该规范没有明确说明 textNode 必须仍然是其先前父节点的子节点,只是更新为包含所有相邻的文本节点(然后删除)。删除所有相邻的文本节点,然后重新创建一个具有值串联的新节点,使 textNode 指向不再是树的一部分的东西,这似乎是一种 conforment 行为。或者,我们可以以与 splitText 相同的方式更新 textNode,使其保留其树位置,并获取新值。
行为的选择确实大不相同,我找不到关于哪个是正确的澄清,或者这是否只是规范中的疏忽(似乎在第 2 级或第 3 级中没有得到澄清)。任何 DOM/XML 专家都能提供一些启示吗?
答:
虽然这似乎是一个合理的假设,但我同意规范中没有明确说明。我所能补充的是,我读取它的方式,它的新兄弟之一(即返回值来自)将包含新的联接值 - 该语句指定子树中的所有节点都以正常形式放置,而不是子树被规范化为新结构。我想唯一安全的做法是在正常化之前保留对父母的引用。textNode
splitText
我认为所有的赌注都在这里;我当然不会依赖任何给定的行为。唯一安全的做法是再次从其父节点获取节点。
早期我是 DOM 工作组的成员;我敢肯定,我们的意思是让 textNode 包含新的联接值,但如果我们没有在规范中说明,则某些实现可能会创建一个新节点而不是重用 textNode,尽管这需要实现者做更多的工作。
如有疑问,请进行防御性编程。
下一个:打印 DOM 更改
评论