如果选择器被缓存,.find()是否会再次遍历DOM?

时间:2015-01-20 10:40:28

标签: jquery caching

我使用这个简单的函数来缓存我的选择器:

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');

感谢您的任何建议!

2 个答案:

答案 0 :(得分:3)

  

“做$ program_home.find('。home_section'); jQuery即将发生   再次遍历DOM?或者它是否得到选择器的孩子   来自缓存版本?“

嗯,两个都没有。

$program_home变量包含一个jQuery对象,该对象包含对先前使用section#program_home选择器找到的元素的引用。

find方法不会搜索整个DOM,它只会搜索这些元素。如果当前还有其他元素也与原始选择器匹配,则不包括这些元素。

此操作中根本不涉及选择器缓存。

答案 1 :(得分:1)

您的$selectors变量是一个jQuery对象,并且您已明确地在该对象上调用了一个方法(.find),所以是的,它将再次遍历DOM(尽管只是查看它的后代)节点,而不是整个DOM。)