有人能给我解释一下为什么在jquery中不可能使缓存失效吗?

有人能给我解释一下为什么在jquery中不可能使缓存失效吗?,jquery,ajax,caching,Jquery,Ajax,Caching,我调用ajax来检索列表,缓存设置为true。稍后,我插入一个新项,并再次检索列表,但这次我将cache设置为false。Jquery正确地显示了正确的列表。此时,我希望jquery开始用新插入的数据缓存这个更新的列表。但是,当我再次调用列表并请求缓存副本时。。。它显示了没有新数据的原始列表!它显然没有使缓存的数据无效 请有人告诉我,我把事情搞砸了,我上面描述的过程是因为我的代码中有一个bug (请原谅我的语言) var messagesPage=; 函数clearForm(表单){ $(表

我调用ajax来检索列表,缓存设置为true。稍后,我插入一个新项,并再次检索列表,但这次我将cache设置为false。Jquery正确地显示了正确的列表。此时,我希望jquery开始用新插入的数据缓存这个更新的列表。但是,当我再次调用列表并请求缓存副本时。。。它显示了没有新数据的原始列表!它显然没有使缓存的数据无效

请有人告诉我,我把事情搞砸了,我上面描述的过程是因为我的代码中有一个bug

(请原谅我的语言)


var messagesPage=;
函数clearForm(表单){
$(表单).find(':input').each(函数(){
开关(此.type){
案例“密码”:
案例“选择多个”:
“选择一个”案例:
案例“文本”:
案例“textarea”:
$(this.val(“”);
打破
案例“复选框”:
“无线电”案例:
此项检查=错误;
}
});
}
函数postForm(表单、触发器){
变量形式=$(形式);
var action=form.attr(“action”);
var serializedForm=form.serialize();
$.post(操作、序列化格式、函数(){
clearForm(表格);
$('body')。触发器(触发器);
});
}
函数取消窗体(触发器){
$('body')。触发器(触发器);
}
函数LoadHtml(url、loadFromCache、占位符ID){
$.ajax({
url:url,
缓存:loadFromCache,
数据类型:“html”,
成功:功能(数据){
$(占位符ID).替换为(数据);
} 
});
}
函数LoadMessageList(loadFromCache){
var url=''+'/'+messagesPage;
LoadHtml(url,loadFromCache,#messageList');
}
函数LoadMessageAdder(){
var url='';
LoadHtml(url,true,#messageEditor');
}
函数LoadMessageUpdater(id){
var url=''+'/'+id;
LoadHtml(url,false,#messageEditor');
}
函数LoadMessageDeleter(id){
var url=''+'/'+id;
LoadHtml(url,false,#messageEditor');
}
$('body').bind('messageListRefreshEvent',函数(e){
LoadMessageList(false);
$('#messageEditor')。文本('';
});
$('body').bind('messageFormCancelEvent',函数(e){
$('#messageEditor')。文本('';
});
$(“#添加消息”)。单击(函数(){
LoadMessageAdder();
});
$(“#以前的消息”)。单击(函数(){
留言板--;
如果(messagesPage<0){messagesPage=0;}
LoadMessageList(true);
});
$(“#下一条消息”)。单击(函数(){
messagesPage++;
LoadMessageList(true);
});

如果我错了,请纠正我:

  • 进行ajax调用以检索列表并将缓存设置为true:JQuery接收对调用的响应,缓存响应并将响应转发给代码
  • 插入项:以前的缓存列表仍然由JQuery维护,没有新添加的项
  • 进行新的ajax调用以检索列表并将缓存设置为false:JQuery接收对调用的响应。因为您告诉过不要缓存这个调用,所以它只是将响应转发给您的代码。所以缓存仍然包含它从第一次调用中获得的列表
  • 您请求一个缓存副本:JQuery向您转发它拥有的唯一一个没有新添加项的缓存副本

  • 听起来像个虫子。想发布代码吗?如果你有时间帮我调试的话,你一定会成功的。但既然你同意这是我代码中的一个bug,我会自己再仔细看看。嗯。。这是另一条线索。这只会发生在IE中hehyeah这正是我的过程。。我将尝试发布一些代码来澄清。这不仅仅是我在这里解释的过程。我还解释了jquery的内部工作。JQuery不会使以前缓存的副本无效,因为您没有告诉它缓存ajax调用以检索包含新添加项的列表。因此,我想,为了解决这个问题,缓存所有用于检索列表的ajax调用,以便最新的列表覆盖缓存中以前的列表。如果我将所有ajax调用缓存在jquery中,jquery如何知道何时需要未缓存的版本?必须有一个命令来强制它删除缓存并获取一个实时版本。我最初是按照你的建议缓存所有调用的。这就是我第一次发现问题的原因。所以我改变了逻辑,在需要实时版本时关闭缓存。
    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MessageListLoader>" %>
    <%@ Import Namespace="GoFuckYourself.Web.Controllers.Messages.ViewModels" %>
    <input type="submit" value="Add Message" id="addMessage" />
    <% Html.RenderPartial("MessageList", Model.Messages); %>
    <input type="submit" value="Previous" id="previousMessages" />
    <input type="submit" value="Next" id="nextMessages" />
    <div id="messageEditor">
    </div>
    <div class="messageListLoader">
    <script type="text/javascript" id="$">
        var messagesPage = <%: Model.Page %>;
    
        function clearForm(form) {
            $(form).find(':input').each(function () {
                switch (this.type) {
                    case 'password':
                    case 'select-multiple':
                    case 'select-one':
                    case 'text':
                    case 'textarea':
                        $(this).val('');
                        break;
                    case 'checkbox':
                    case 'radio':
                        this.checked = false;
                }
            });
        }
    
        function postForm(form, trigger) {
            var form = $(form);
            var action = form.attr("action");
            var serializedForm = form.serialize();
    
            $.post(action, serializedForm, function () {
                clearForm(form);
                $('body').trigger(trigger);
            });
        }
    
        function cancelForm(trigger) {
            $('body').trigger(trigger);
        }
    
        function LoadHtml(url, loadFromCache, placeholderid) {
            $.ajax({
                url: url,
                cache: loadFromCache,
                dataType: "html",
                success: function (data) {
                    $(placeholderid).replaceWith(data);
                } 
            });
        }
    
        function LoadMessageList(loadFromCache) {
            var url = '<%: Url.Action("loadpage", "messages", new { CategoryName = Model.Category.CategoryName })%>' + '/' + messagesPage;
            LoadHtml(url, loadFromCache, '#messageList');
        }
    
        function LoadMessageAdder() {
            var url = '<%: Url.Action("insert", "messages", new { CategoryName = Model.Category.CategoryName }) %>';
            LoadHtml(url, true, '#messageEditor');
        }
    
        function LoadMessageUpdater(id) {
            var url = '<%: Url.Action("update", "messages", new { CategoryName = Model.Category.CategoryName }) %>' + '/' + id;
            LoadHtml(url, false, '#messageEditor');
        }
    
        function LoadMessageDeleter(id) {
            var url = '<%: Url.Action("delete", "messages", new { CategoryName = Model.Category.CategoryName }) %>' + '/' + id;
            LoadHtml(url, false, '#messageEditor');
        }
    
        $('body').bind('messageListRefreshEvent', function (e) {
            LoadMessageList(false);
            $('#messageEditor').text('');
        });
    
        $('body').bind('messageFormCancelEvent', function (e) {
            $('#messageEditor').text('');
        });
    
        $('#addMessage').click(function() {
            LoadMessageAdder();
        });
    
        $('#previousMessages').click(function() {
            messagesPage--;
            if(messagesPage < 0) { messagesPage = 0; }
            LoadMessageList(true);
        });
    
        $('#nextMessages').click(function() {
            messagesPage++;
            LoadMessageList(true);
        });
    </script>