jQuery缓存选择器

我有id #wrapper div,所有元素都在里面。 我正在通过这样做来缓存包装器

 var $wrapper = $('#wrapper'); 

现在,无论何时我想制作一个选择器或引用一个元素,我都可以

 $wrapper.find('#whatever').click(.... 

通过这样做,我避免再次使用jQuery对象包装,因此我将来做的任何选择器都将基于缓存的$wrapper 。 但另一方面,当我使用带有缓存的$ wrapper的find()时,我知道它会搜索#wrapper所有元素。 我的问题是更好更好,使用缓存变量以及查找然后发出click事件,或者只是简单地执行$('#whatever').click(..

whatever是类还是id whatever可以。

如果你在whateverID IDID地方使用它,那么$('#whateverID').click(..会给你稍微好一点的性能,但是如果whateverCLASS$wrapper.find('whateverCLASS').click(....是类还是ID以外的任何东西, $wrapper.find('whateverCLASS').click(....会更好,因为遍历将限于特定容器,它是整个DOM的子集

性能方面,最好缓存DOM元素的“包装”版本。 否则,每次你执行$("#myElem")时你都会遍历DOM,如果你的DOM非常大或者你做了很多次,这会变得非常昂贵。

这两者并不完全相同。 您的缓存版本实际上与$("#wrapper #whatever") ,并且如果它不包含在包装器div中,则不会与具有id的元素匹配。

如果你总是希望#whatever元素在#wrapper ,那么$('#whatever')实际上可能比你的缓存版本更快 – 按ID查找元素涉及单个函数调用getElementById ,它可以在所有浏览器,而您的缓存版本涉及检查层次结构以确保匹配的#whatever元素来自#wrapper

怎么样$(’选择器’,上下文)所以……

 $('#whatever', $wrapper) 

仅在$ wrapper的上下文中搜索DOM

当您可以搜索单个分支或树枝时,请勿搜索整个树。