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

Does .find() traverse the DOM again if the selector is cached?

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

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吗?或者它是否从缓存版本中获取选择器的 children?

我想避免再次遍历 DOM,所以如果 jQuery 再次遍历 DOM,也许最好的解决方案是将 children 缓存为好吧(?)像这样:$selectors.get('section#program_home .home_section');

感谢任何建议!

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

"Doing $program_home.find('.home_section'); jQuery is going to traverse the DOM again? Or does it get the children of the selector from the cached version?"

嗯,都不是。

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

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

这个操作根本不涉及选择器缓存。