Javascript 如何在通过AJAX添加元素后更新缓存的jquery对象

Javascript 如何在通过AJAX添加元素后更新缓存的jquery对象,javascript,jquery,ajax,Javascript,Jquery,Ajax,我试图在jQuery中编写一个类似插件的函数,用AJAX将元素添加到容器中。 看起来是这样的: $.fn.cacheload = function(index) { var $this = $(this); $.get("cache.php", {{ id: index }).done(function(data) { // cache.php returns <div class='entry'>Content</div> ...

我试图在jQuery中编写一个类似插件的函数,用AJAX将元素添加到容器中。 看起来是这样的:

$.fn.cacheload = function(index) {
    var $this = $(this);
    $.get("cache.php", {{ id: index }).done(function(data) {
        // cache.php returns <div class='entry'>Content</div> ...
        $(data).insertAfter($this.last());
    });
}
var entries = $("div.entry"),
    id = 28;

entries.cacheload(id);
假设这将加载另一个“条目”——容器并将其添加到DOM中

这是迄今为止的工作。但是,保存缓存jQuery对象(
条目
)的变量当然不会更新。因此,如果在开始时有两个div,您可以使用此函数添加另一个div,它将显示在DOM中,但是
条目
仍然只会引用原始的两个div

我知道不能使用get的返回值,因为AJAX调用是异步的。但是有没有办法更新缓存对象,使其也包含通过AJAX加载的元素

我知道我可以这样做,并在插入以下内容后重新查询:

    $.get("cache.php", {{ id: num }).done(function(data) {
        $(data).insertAfter($this.last());
        entries = $("div.entry");
    });
但为此,我必须直接引用保存缓存对象的变量。 有没有办法使函数是自包含的? 我尝试重新分配
$(此)
,但出现错误
.add()
不会更新缓存的对象,它会创建一个新的(临时)对象

非常感谢

//更新:

约翰在下面给出了一个非常好的答案。然而,我最终意识到,对我来说,其他东西实际上会更好。
现在,plugin函数(同步)插入一个空白元素,当AJAX调用完成时,该元素的属性将更新。这也确保了元素以正确的顺序加载。对于任何在这方面遇到困难的人,这里有一个JSFiddle:

正如您自己所说的,ajax调用是异步的。因此,您的插件也是异步的。在ajax调用返回之前,插件无法向jQuery对象添加新元素。另外,正如您所发现的,您不能真正添加到原始jQuery对象,只能创建一个新的jQuery对象

你能做的就是让插件把回调函数作为第二个参数。回调可以传递一个jQuery对象,该对象包含原始元素和新插入的元素

$.fn.cacheload = function(index, callback) {
    var $this = this;
    $.get('cache.php', { id: index }).done(function(html) {
        var $elements = $(html);
        $this.last().after($elements);
        if (callback) {
            callback.call($this, $this.add($elements));
        }
    });
    return $this;
};
然后你可以打电话:

entries.cacheload(id, function($newEntries) { doSomething($newEntries); } );
当然,您可以这样做:

entries.cacheload(id, function($newEntries) { entries = $newEntries; } );
但是,
条目
在ajax调用返回之前不会被更改,所以我看不出它有多大价值


顺便说一句:
这个
在插件中指的是jQuery对象,所以不需要调用
$(这个)

非常感谢。这就是我要找的。事实上,你的第二个例子对我很有帮助,尽管你看不出它有什么价值。我在
窗口resize
上对缓存对象调用一个函数,因此缓存对性能很重要,我需要缓存来表示实际存在的内容。还是我错过了什么?@pjupju-我不认为你错过了什么。我想我理解你在做什么,我看到了像这样更新
条目对你来说是多么有意义。太棒了,谢谢你。顺便说一句,对于任何可能也在尝试这一点的人来说:我刚刚发现,要想让这一点发挥作用,在插入和添加之前缓存结果非常重要,就像John s使用
var$elements=$(html)所做的那样。否则,DOM中的对象会与
条目中的对象不同。进一步研究后,我意识到我需要一些不同的东西。我自己找到了一个解决方案,并用它更新了主要帖子。