Javascript jQuery类选择器与缓存元素+;找到

Javascript jQuery类选择器与缓存元素+;找到,javascript,jquery,sizzle,Javascript,Jquery,Sizzle,我有一种情况,我想知道最好的方法是性能方面的 我有一个类名,让我们称它为。class test。 我还有一个缓存元素,$body 我可以通过以下方式检索.class测试元素: $('.class-test') 或者 在最坏的情况下,这些方法中的一种会战胜另一种吗?另外,如果有人能够用第二种方法描述在后台正在做什么,那将是非常好的(即,我知道。find遵从Sizzle,但是如果元素被缓存,那么它是否已经存储了一个DOM元素树,那么它只需要遍历该子树就可以找到类?或者该树只是根据需要构建的?).不

我有一种情况,我想知道最好的方法是性能方面的

我有一个类名,让我们称它为。class test。 我还有一个缓存元素,$body

我可以通过以下方式检索.class测试元素:

$('.class-test')
或者


在最坏的情况下,这些方法中的一种会战胜另一种吗?另外,如果有人能够用第二种方法描述在后台正在做什么,那将是非常好的(即,我知道。find遵从Sizzle,但是如果元素被缓存,那么它是否已经存储了一个DOM元素树,那么它只需要遍历该子树就可以找到类?或者该树只是根据需要构建的?).

不同之处在于可以说您在DOM池中浸泡了多少次。在第一个查询中,jQuery将从文档(顶层)中进行搜索,然后向下进入DOM树,检查每一层,直到最后返回所有匹配的元素

在第二个选项中,您指定了起点,因此,您不是从最顶部开始,而是从body元素开始。在这种情况下,您只需要降低一个级别,但这是真正的优点,因为您缓存了主体,jquery不必发现它可以只引用缓存的元素


当您深入了解DOM树时,这可以节省大量时间。您可以保存10到100秒的级别检查。虽然你不会注意到小型网站有这么多,但有一天你可能会使用企业级代码库,这些性能提升将对你非常有益。

在这里尝试一下,除非你查找数千个元素,否则你永远不会注意到差异。是的,这就是我说的最坏情况的原因。因为大多数jQuery性能指标依赖于使用数千个元素。我还想知道在第二种方法的框架下发生了什么。很可能是foreach在每个选定元素上循环,对于每个选定元素,它都在执行
元素。getElementsByClassName(“类测试”)
然后将它们作为一个唯一的元素集合连接起来。在您的示例中,差异非常小,但是在一个更大的示例中,缓存元素比主体更精确,性能差异可能更大。这方面没有一般规则。在多个浏览器中逐个测试它。是的,这就是我的想法,也是为什么我总是尝试缓存我的元素并使用find。我想我真的应该问的是缓存元素是否意味着我们将它的DOM结构存储在内存中,我想这就是发生的情况,因此,当我使用“find”方法引用缓存元素时,我们不必在执行“find”之前初始化缓存元素的DOM树。为了澄清这一点,jquery在现代浏览器中使用默认的querySelector和querySelectorAll,并依赖于Sizzle(它们的选择器引擎)对于较老的浏览器,“查找”并不特别遵从Sizzle.find?是的,但是Sizzle在幕后将使用el.queryselectoral(),如果在现代浏览器中,为了节省一点时间和Sizzle的检查,您可以执行$(el.querySelectorAll('.test class'),这将是获得jquery包装的元素集的一种稍微快一点的方法
$body.find('.class-test')