强制Ajax调用清除缓存

7
我有一个内容管理系统,在其中可以更改对象的位置。每次更改位置后,ajax调用会更新整个对象列表。但不幸的是,一些数据存储在缓存中,没有变化是可见的。是否有一种方法可以使用javascript /请求/其他方式来强制清除缓存?我尝试了$.ajax中的“缓存:false”,但它不起作用。
这是一个示例页面:

http://ntt.vipserv.org/manage/playforward

我的js:

$(".object-position").livequery("change", function() {
    $("#objects-list input").attr('disabled', true);
    var action = $(this).attr('name');
    var position = $(this).attr('value');
    var id = $(this).attr("id");
    var model = id.split("-")[0];
    var object_id = id.split("-")[1];

    $("#loader").show();
    $("#loader").fadeIn(200);

    $.ajax({
        type: "POST",
        async: true,
        url: "/manage/update_position/",
        data: "action=" + action + "&model=" + model + "&object_id=" + object_id + "&position=" + position,
        dataType: "json",
        success: function(data){
            $("#loader").fadeOut("fast", function () {
                $("#loader").hide();
            });
            $("objects-list").html(data["html"]);
            $("#message").show();
            $("#message").fadeIn(400).html('<span>'+data["message"]+'</span>');
            setTimeout(function(){
                $("#message").fadeOut("slow", function () {
                    $("#message").hide();
                });
            }, 1500); 
        }
    });
    $("#objects-list input").attr("disabled", false);
    return false;
});
3个回答

20

cache: false的作用是在请求数据中添加时间戳,使每个请求都是唯一的,从而跳过浏览器缓存。我想知道你使用数据字符串而不是对象是否会导致问题。尝试改用对象:

$.ajax({
    type: "POST",
    async: true,
    url: "/manage/update_position/",
    data: {
        "action": action.
        "model": model,
        "object_id": object_id,
        "position": position
    },
    cache: false,
    dataType: "json",
    success: function(data){
        //[snip]
    }
});

1
我确认 - 这确实有效。cache:false会向URL添加时间戳,因此每次加载新内容。 - alekwisnia

7

只需替换即可

url: "/manage/update_position/",

使用

url: "/manage/update_position/?nocache="+Math.random(),

强制重新加载页面而不使用浏览器缓存。


1
那可能会轻易地搞乱路由系统。如果你要手动执行这个操作,最好将其作为请求参数:"/manage/update_position/?nocache="+Math.random() - lonesomeday
是的,你说得对。我在原帖中忘记包含一个“?”了。应该是:"/manage/update_position/?"+Math.random(), - remi

2

你拥有

$("objects-list").html(data["html"]);

尝试使用以下方法:
$(".objects-list").html(data["html"]); // forgot leading dot?

此外,看起来你正在尝试用一些包含<table>元素本身的HTML替换.objects-list表的内容。因此,在.html()内容替换之后,你将会有<table...><table...>等等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接