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

时间:2010-10-16 21:31:21

标签: jquery

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

如果这是真的,那么有没有办法在第一场比赛后停止DOM搜索?例如,如果我知道此查询的结果将始终是单个元素,那么如何告诉jQuery不要浪费时间进一步搜索?

3 个答案:

答案 0 :(得分:12)

据我所知,目前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();
}

但是,通过这样做可以节省querySelectorAll,从而节省的金额远远小于您节省的金额。

答案 1 :(得分:5)

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

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

所以使用:first看起来就像你需要的那样,但仔细观察,他们首先使用选择器找到一个集合,然后继续使用第一个集合。

有一些评论和讨论herehere似乎表明:first()并未停留在第一个元素。

参考文献:

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

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

答案 2 :(得分:0)

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

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

您可以做的是使您的查询更具体,以便选择较少的内容,并且jQuery要排序的元素较少,以便找到第一个。例如,$('li:first')不是非常具体,而且会很慢。 $('#myList> li:first')理论上会快得多(虽然我没有对其进行基准测试)因为a)它只会搜索一个列表,而b)子列表也会被排除在外。

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

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

现在elems将保持全套,firstElem将只保留第一个元素。

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