我使用这个简单的函数来缓存我的选择器:
var selector_cache = function(){
var collection = {};
function get_from_cache( selector ) {
if (undefined === collection[selector]) {
collection[selector] = $(selector);
}
return collection[selector];
}
return { get: get_from_cache };
};
要获取我的缓存选择器,我会执行以下操作:
window.selectors = new selector_cache();
var $selectors = window.selectors;
var $program_home = $selectors.get('section#program_home');
我的问题是:做$program_home.find('.home_section');
jQuery会再次遍历DOM吗?或者它是否从缓存版本中获取选择器的子项?
我想避免再次遍历DOM,所以如果jQuery再次遍历DOM,也许最好的解决方案是缓存子节点(?),如下所示:$selectors.get('section#program_home .home_section');
感谢您的任何建议!
答案 0 :(得分:3)
“做$ program_home.find('。home_section'); jQuery即将发生 再次遍历DOM?或者它是否得到选择器的孩子 来自缓存版本?“
嗯,两个都没有。
$program_home
变量包含一个jQuery对象,该对象包含对先前使用section#program_home
选择器找到的元素的引用。
find
方法不会搜索整个DOM,它只会搜索这些元素。如果当前还有其他元素也与原始选择器匹配,则不包括这些元素。
此操作中根本不涉及选择器缓存。
答案 1 :(得分:1)
您的$selectors
变量是一个jQuery对象,并且您已明确地在该对象上调用了一个方法(.find
),所以是的,它将再次遍历DOM(尽管只是查看它的后代)节点,而不是整个DOM。)