如何防止jQuery Ajax缓存?

3

请问有人能帮我解决这个问题吗?我有一个使用.manifest进行离线存储缓存的网页。在该页面中,我使用jQuery ajax调用从服务器获取数据。如果我首先加载页面,一切正常。我可以在在线和离线之间切换。但问题是当我重新联网并刷新页面时,jQuery ajax就不能再与服务器通信了。是否有一种方法让ajax与服务器通信或清除离线缓存?

我的ajax调用如下:

        $.ajax({

            type: "GET",

            url: requestUrl,
            success: localSuccess,

            error: error,

            dataType: "text",
            cache:false
        });

我有点困惑,如果你无法访问服务器,为什么要清除离线缓存? - Kerry Jones
Kerry,我不想清除离线缓存。我只想将我的localStorage(HTML5功能)与服务器同步。但是如果允许离线缓存,我无法进行同步。没有那个缓存,它可以正常工作。 - cynwong
3个回答

5

我在每个页面/主页的顶部都有这段代码

    //Disable caching in IE, becuase it's EVIL!
    $(document).ready(function () {
        $.ajaxSetup({ cache: false });
    });

1
我刚写了这个,但是没有发布,因为在给出的示例中已经传递了'cache:false'作为最后一个设置。 - istruble
谢谢,阿拉斯泰尔。但我仍然无法连接到服务器 :(. 我现在在想这是否与浏览器缓存有关。 - cynwong
@cynwong:糟糕,我没有看到ajax调用中的cache:false。那么我的代码就没用了。你能提供更多关于在线/离线决策的细节或JavaScript代码吗?我有点困惑。 - Alastair Pitts
Alastair,我正在使用navigator.onLine检测在线/离线状态。我正在使用HTML5 localStorage功能。我希望在在线时进行同步。因此,即使离线,用户仍然可以访问数据并进行修改。 - cynwong

0

我知道我来晚了,但还是想说一下。很抱歉让这个问题从“僵尸地带”复活。 在Safari和一些旧版浏览器中,(根据我目前的经验),cache:false有时似乎不起作用。为了更好地兼容各种浏览器,您可以在ajax()调用中添加一个数据选项,并将随机数生成器作为参数添加进去。代码如下:

 var callback = function () {
   $.ajax({
      type: "GET",
      url: requestUrl,
      success: localSuccess,
      error: error,
      dataType: "text",

      //won't work sometimes
      cache:false,

      //start random number generator
      data : { r: Math.random() }
     //end random number generator
   });
  }

每次服务器调用时,都会生成一个新的随机数,由于数据与之前的请求不同,因此ajax请求不会被缓存,并确保每次都进行新的服务器调用。在您的服务器中,您可以忽略这个变量r

0
将随机字符串放入URL中,例如"get.php?random="+Math.random(),可以解决这个问题。虽然不是最好的解决方案,但它非常有效。

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