【问题标题】:Get first DOM element in list获取列表中的第一个 DOM 元素
【发布时间】:2013-09-17 16:55:29
【问题描述】:

我有一个 DOM 元素数组,不是按 DOM 顺序排列的。如何获得第一个,即 DOM 中第一个出现的那个?

如果 jQuery 能在这里提供帮助就更好了。

谢谢

【问题讨论】:

  • 它们都有相同的父元素吗?
  • $('selector:first')..???
  • @Dipesh Parmar - 我没有选择器,只有一个数组
  • 为什么投反对票?请告诉我,这样我以后就不会犯同样的错误了……
  • 我很好奇这个数组是从哪里来的。

标签: javascript dom


【解决方案1】:

既然你说 visual 顺序(而不是 DOM 顺序)就足够了,你可以这样做:

var first, firstTop, firstLeft;
$.each(yourArray, function(index, element) {
    var pos = $(element).offset();
    if (!first ||
        (pos.top < firstTop) ||
        (pos.top === firstTop && pos.left < firstLeft)
       ) {
        first = element;
        firstTop = pos.top;
        firstLeft = pos.left;
    }
});

也就是说,我不认为在 DOM 上进行递归下降并在找到的第一个元素处停止确实与您从评论中认为的工作量一样多,尤其是。因为您只对表单中的元素感兴趣。大致如下:

function getFirstInDOM(list, root) {
    var node, found;
    for (node = root.firstChild; node; node = node.nextSibling) {
        // I assume you only care about elements, so skipping other nodes
        if (node.nodeType === 1) {
            if (list.indexOf(node) !== -1) {
                // Found
                return node;
            }
            found = getFirstInDOM(list, node);
            if (found) {
                return found;
            }
        }
    }
    return null;
}

Live Example | Live Source

【讨论】:

    【解决方案2】:

    发现这个stackoverflow answer 声明当您使用 jQuery 添加两个元素时,它们将按文档顺序结束。

    所以基本上我们可以只做 $().add(elementList).eq(0)。

    【讨论】:

    • 啊,是的,那是clearly documented: "不要假设此方法将元素按照传递给 .add() 方法的顺序附加到现有集合中。当所有元素都是同一个文档的成员,来自 .add() 的结果集合将按文档顺序排序;也就是说,按照每个元素在文档中出现的顺序。” 我想知道哪个更快,这个或我在上面的递归搜索(毕竟 jQuery 必须工作才能确定顺序)。请注意,这是对用户操作的响应,不太可能对速度至关重要。
    猜你喜欢
    • 2016-12-31
    • 2020-07-31
    • 2019-04-19
    • 1970-01-01
    • 2014-05-03
    • 2019-05-20
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多