代码之家  ›  专栏  ›  技术社区  ›  Adam Wright

DOM是否应该拆分文本并规范化组合以给出标识?

  •  8
  • Adam Wright  · 技术社区  · 17 年前

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

    在……里面 DOM Level 1 Core ,Text.splitText定义为。。。

    在指定的偏移处将此文本节点分解为两个文本节点,并将两者作为兄弟节点保留在树中。然后,此节点仅包含偏移点之前的所有内容。一个新的“文本”节点作为该节点的下一个兄弟节点插入,包含偏移点及其后的所有内容。

    常态化是。。。

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

    因此,如果我取一个包含“Hello World”的文本节点,在textNode中引用,并执行以下操作

    textNode.splitText(3)
    

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

    如果我

    textNode.parent.normalize()
    

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

    行为的选择真的很不一样,我找不到一个关于哪个是正确的澄清,或者这只是规范中的一个疏忽(在第2或第3级似乎没有澄清)。任何DOM/XML大师都能提供一些线索吗?

    3 回复  |  直到 6 年前
        1
  •  4
  •   David Singer    17 年前

    我早期是DOM工作组的成员;我确信我们 原本打算的 让textNode包含新的连接值,但如果我们没有 在规格中,有可能 一些 实施 可能 创建一个新节点,而不是重用textNode,尽管这需要实现者做更多的工作。

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

        2
  •  1
  •   Sam Brightman    17 年前

    虽然这似乎是一个合理的假设,但我同意规范中没有明确说明。我所能补充的是,我阅读它的方式,要么 textNode 或者它是新的兄弟(即返回值来自 splitText )将包含新的连接值-该语句指定所有节点 在子树中 这并不是说子树被标准化为新的结构。我想唯一安全的办法是在正常化之前保留对父母的引用。

        3
  •  1
  •   Adrian Mouat    17 年前

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