DOM splitText是否应该进行标准化处理以提供标识?

问题描述 投票:8回答:3

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

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

将此Text节点按指定的偏移量分成两个Text节点,将两个Text节点都保留为同级。然后,此节点仅包含直到偏移点为止的所有内容。一个新的Text节点(作为该节点的下一个兄弟节点插入)包含在偏移点及其之后的所有内容。

归一化是...

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

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

textNode.splitText(3)

textNode现在具有内容“ Hello”,以及一个包含“ World”的新同级元素

如果我那么

textNode.parent.normalize()

什么是textNode?该规范并未明确指出textNode必须仍然是其先前父级的子级,只是对其进行了更新以包含所有相邻的文本节点(然后将其删除)。删除所有相邻的文本节点,然后使用值的串联重新创建一个新节点,这似乎是一种一致的行为,而textNode指向的树不再是该树的一部分。或者,我们可以以与splitText相同的方式更新textNode,以便它保留其树的位置并获取新值。

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

xml dom
3个回答
5
投票

我在早期是DOM工作组的成员;我确定我们meant允许textNode包含新的联接值,但是如果我们在规范中没有say的话,很可能some实现might创建一个新节点而不是重用textNode,尽管这将需要实现者做更多的工作。

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


2
投票

虽然这似乎是一个合理的假设,但我同意说明书中并未明确明确指出。我所能补充的是,我的阅读方式(无论是textNode还是新兄弟姐妹(即splitText的返回值))都将包含新的联接值-该语句指定所有节点以常规形式放置,而不是将子树规范化为新结构。我猜唯一安全的是在规范化之前保留对父级的引用。


2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.