如何创建jQuery元素缓存机制?

时间:2010-08-13 16:02:57

标签: javascript jquery oop dom caching

我认为我编写了一个简单的DOM缓存机制,以提高效率,避免多次$('blah')调用,例如:

if ($('foo').length) {
    $('foo').bar();
}

所以我在项目主对象下创建了一个DomCache子对象:

MyLib.DomCache = {};

当我需要一个元素的jQuery对象时,我会查看DomCache,如果我找到了它,我会使用它,否则我会创建它,然后将它放入DomCache对象中。我认为这将是一个很好的语法:

MyLib.DomCache.foo = MyLib.DomCache.foo || $('foo');
if (MyLib.DomCache.foo.length)
    MyLib.DomCache.foo.bar();

但现在我认为.get() getter方法可能效果更好:

MyLib.DomCache.get('foo').bar(); 

我无法实现这一点!我不知道如何实现这样的方法!!

// THIS IS THE QUESTION!
MyLib.DomCache.get = function(element){
    // TODO: If the passed `element` has been cached previously,
    // return it. If not, cache it in the MyLib.DomCache object and then return it.
};

任何帮助/想法?
为什么这么多物品?老实说,该项目非常大,所以我认为我必须将所有内容都包装在父对象中以获得更好的访问权限!

3 个答案:

答案 0 :(得分:1)

您可以使用现有解决方案,或将其用作灵感。例如,http://plugins.jquery.com/project/jCacher

答案 1 :(得分:0)

嗯,这对我来说似乎不必要的复杂。如果你担心额外的DOM查找,为什么不这样呢?

var $foo = $("foo");
if ($foo.length) {
    $foo.bar();
}

答案 2 :(得分:0)

MyLib.DomCache = {
    pool: new Array(),
};

MyLib.DomCache.get = function(selector){
    if(this.pool[selector]){
        console.log('Existing element returns!'); // debug
        return this.pool[selector];
    }else{
        console.log('Element has been created & returned!'); // debug
        return this.pool[selector] = $(selector);
    }
};

// Test
if(MyLib.DomCache.get('#foo').length){
    MyLib.DomCache.get('#foo').bar();
}

我知道你担心什么&它以某种方式让我想起Singleton Pattern