代码之家  ›  专栏  ›  技术社区  ›  serg

如何告诉jquery在找到第一个元素时停止搜索dom?

  •  24
  • serg  · 技术社区  · 14 年前

    根据我的理解,补充 .first() :first 对于查询,第一次匹配后不会停止DOM搜索。它只是告诉jquery从匹配的集合中取出第一个元素。

    如果是这样,那么在第一次匹配之后是否有方法停止DOM搜索?例如,如果我知道这个查询的结果总是一个元素,如何告诉jquery不要浪费时间进一步搜索?

    3 回复  |  直到 9 年前
        1
  •  12
  •   bobince    14 年前

    据我所知,目前在jquery中无法做到这一点。你能做的最好的就是 $(selector).first() 在哪里 selector 是标准的CSS选择器,不包括任何特定于sizzle的选择器(因此不要使用 :first )在这种情况下,jquery使用快速dom querySelectorAll 现代浏览器中的方法。

    您可以使用DOM手动获得优化。 querySelector 生成的方法只能选择第一个匹配项:

    $.getFirst= function(selector) {
        if ('querySelector' in document)
            return $(document.querySelector(selector));
        else
            return $(selector).first();
    }
    

    但是,通过这样做可以节省的金额要比通过确保 查询选择单元格 可以使用。

        2
  •  5
  •   Moin Zaman    14 年前

    :first 只匹配一个元素。它相当于 :eq(0) .

    .first() 将匹配的元素集减少到集合中的第一个。

    所以使用 首先 看起来像是你需要的,但是仔细看,他们都是先使用选择器来查找集合,然后再使用第一个。

    有一些评论和讨论 here here 这似乎表明 :first() 不会在第一个元素处停止。

    参考文献:

    http://api.jquery.com/first-selector/

    http://api.jquery.com/first/

        3
  •  0
  •   GordonM    14 年前

    我不是jquery内部的专家,但我的理解是jquery发现事物的顺序不一定是它们在DOM中出现的顺序。为了确保您确实获得了DOM中第一个的项,jquery将获取所有内容并对结果进行排序,以便返回第一个元素。

    正如您所注意到的,这是一个性能问题。但是,我不相信你能阻止这种行为。

    您可以做的是使您的查询更具体,这样选择的查询更少,jquery排序以查找第一个查询的元素也更少。例如,$('li:first')不是很具体,而且速度很慢。从理论上讲,$('mylist>li:first')将更快(尽管我没有将其作为基准进行检查),因为a)它将只在单个列表中搜索,b)子列表也将被排除。

    如果您将在某个时间点使用某个选择中的所有项,但在特定时间点只需要第一个项,那么运行选择器以获取所有元素并将其保存到var是有意义的,然后在需要时使用.first()获取第一个元素。

    var elems = $('li'), firstElem = elems.first ();
    

    现在,Elems将保存完整的集合,FirstElem将只保存第一个元素。

    当然,您也可以只给出每个组中您打算选择特定类的第一个元素,但这可能被认为是一个不雅的解决方案。