【问题标题】:How can I test which node comes first?如何测试哪个节点先出现?
【发布时间】:2016-03-28 03:07:17
【问题描述】:

我有两个存储在变量中的给定节点。是否有一个简单、资源使用率低的解决方案来查找文档中哪个节点排在首位?两个节点应该是兄弟节点,但可能有很多节点相隔。

【问题讨论】:

  • 这有关系吗? stackoverflow.com/questions/7208624/… 。我会使用第二个答案
  • @JosephYoung 我正在寻找一个纯 JavaScript 解决方案,因为我打算将它用于移动节点的算法,我担心 JQuery 可能会破坏该算法。不过我会阅读一些答案:) 谢谢。
  • @JosephYoung 该问题的所有答案似乎都包含 JQuery。
  • 如果您确定他们是兄弟姐妹,您是否考虑过使用nextSibling?从节点 A 开始,您可以编写一个使用 nextSibling 的简单函数并检查它是否确实是节点 B。如果您遍历所有兄弟节点并且找不到节点 B,则节点 A 是第二个。
  • @Steve 我没有提到(但我现在将其添加到问题中)是这些节点处于同一级别,但它们之间可能有很多节点。

标签: javascript dom nodes


【解决方案1】:

这样的东西应该可以工作

function isAfter(n1, n2) {
    var prev = n1.previousSibling,
        res  = true;

    while (prev) {
        if ( prev === n2 ) {
            prev = res = false;
        } else {
            prev = prev.previousSibling;
        }
    }
    return !!res;
}

只需从第一个节点使用previousSibling 向上迭代(或使用nextSibling 向下迭代),然后与第二个节点进行比较以查看是否在第一个节点之后(或之前)。
当没有更多兄弟姐妹时,previousSibling returnsnull` 并且循环结束。

FIDDLE

【讨论】:

  • 我已经实现了这段代码并且它可以工作。但是,我现在看到了另一个答案,它可能更有效,因为它不涉及算法。 +1 :)
【解决方案2】:

试试compareDocumentPosition:

function theFirst(node1, node2) {
  return node1.compareDocumentPosition(node2)
    & Node.DOCUMENT_POSITION_FOLLOWING ? node1 : node2;
}

请注意,如果节点位于不同的树中,则结果可能是随机的(但一致)。您可以使用& Node.DOCUMENT_POSITION_DISCONNECTED 过滤掉这种情况并返回例如undefined.

【讨论】:

  • 您能提供一个带有此代码的 jsfiddle/code sn-p 吗?谢谢你的回答。 +1
  • 我已经实现了这段代码,它似乎更有效率。我会接受这个作为最佳答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 2015-05-12
  • 1970-01-01
  • 2020-04-25
  • 2022-07-23
  • 1970-01-01
相关资源
最近更新 更多