我有一个id为#wrapper
的div,所有元素都在里面。我通过
var $wrapper = $('#wrapper');
现在任何时候我想创建一个选择器或引用一个元素,我做
$wrapper.find('#whatever').click(....
通过这样做,我避免了再次使用jQuery对象包装,所以我将来做的任何选择器都将基于缓存的$wrapper
。但另一方面,当我使用find()
与缓存的$包装器,我知道它会搜索#wrapper
内的所有元素。我的问题是哪一个更好更好,使用缓存变量与查找然后问题点击事件,或只是简单地做$('#whatever').click(..
whatever
可以是类也可以是id。
如果你在whateverID
是ID
的地方使用它,那么$('#whateverID').click(..
会给你稍微更好的性能,但是如果whateverCLASS
是类或ID
以外的任何东西,$wrapper.find('whateverCLASS').click(....
会更好,因为遍历将被限制到特定的容器,这是整个DOM的子集
性能方面,最好缓存DOM元素的"包装"版本。否则每次执行$("#myElem")
时都要遍历DOM如果DOM非常大或者执行了很多次,成本会非常高
两者并不完全等同。您的缓存版本实际上与$("#wrapper #whatever")
相同,如果没有包含在包装器div中,则不会匹配id为whatever
的元素。
如果您总是打算将#whatever
元素放在#wrapper
中,那么$('#whatever')
实际上可能比您的缓存版本更快-通过ID查找元素涉及单个函数调用,getElementById
,这在所有浏览器中都可用,而您的缓存版本涉及检查层次结构以确保匹配的#whatever
元素来自#wrapper
。
$('selector', context) so…
$('#whatever', $wrapper)
只在$wrapper
上下文中搜索DOM