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

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

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

据我所知,目前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您通过这样做节省的金额远远小于您节省的金额。

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

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

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

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

参考文献:

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

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

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

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

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

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

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

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

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