2016-02-01 63 views
3

我有一个AJAX调用,它根据简单的标准参数(如月份)从不断变化的数据库中返回值。在IE中,这个函数返回缓存的数据,它永远不会。我监视了服务器端,并没有与客户端联系。防止ajax调用缓存的正确方法是什么?

现在,我的标题问题已经以不同的方式询问过,这里已经有很多次了。上面的两个解决方案:

  • 设置cache: false
  • 传递一个随机数/字符串/时间戳拨打电话是唯一的。

但事情是,cache: false不起作用,至少不是在我的应用程序。另一方面,传递一个唯一的字符串来防止缓存,看起来像是一个快速修复黑客。我不喜欢它。那么防止ajax调用缓存的正确方法是什么?

Ajax调用不防止缓存方面工作:

$.getJSON("myURL", { 
     json : jsonDataObject, 
     cache: false 
    }).success(function(data) {     
     //do something with data 
}); 

我自己也尝试调用它自己$.ajaxSetup({ cache: false });,调用发生之前,但都没有效果......

+0

在带有随机值的url中添加参数 – developerCK

+0

您是否可以控制服务器端点?它返回什么缓存标题? – ChaseMedallion

回答

5

首先,你以为你是在为你$.getJSON()通话设置cache假的方式不正确。您将密钥/值对传递给服务器,以便请求URL看起来像site.com/resource?cache=false

您需要使用$.ajax()方法提出请求,以便您实际上可以将cache选项设置为false。但是,所有这些都是你所说的“快速修复黑客”。它将_={current_timestamp}添加到查询字符串中,以便不会缓存该请求。

$.ajax({ 
    url: 'myurl', 
    type: 'GET', 
    dataType: 'json', 
    data: jsonDataObject, 
    cache: false, // Appends _={timestamp} to the request query string 
    success: function(data) { 
     // data is a json object. 
    } 
}); 

在我看来,这不是一个快速修复或黑客攻击,这是确保你从服务器获取一个新的响应的正确方法。

如果你不想做,每一次,那么你可以使用自己的包装函数:

$.getJSONUncached = function (url, data, successCallback) { 
    return $.ajax({ 
     url: url, 
     type: 'GET', 
     dataType: 'json', 
     data: data, 
     cache: false, // Appends _={timestamp} to the request query string 
     success: successCallback 
    }); 
}; 

然后,你可以用$.getJSONUncached()

+0

aaah!现在我得到$ .ajax参数和$ .getJSON参数之间的区别。但是:'.ajaxSetup({cache:false});'后面跟着'$ .getJSON(...'应该可以工作,不是吗?我现在看到在文档中不鼓励使用ajaxSetup。或许你会用上面的例子来解决问题,如果可行,我会接受答案:)谢谢。 – KjetilNordin

+0

用'$ .ajaxSetup'全局设置它应该可以工作,但是当你发现它是不鼓励的,并且任何其他脚本都有可能覆盖它,所以不应该依赖它。 – Andy

+1

我看到答案现在已经更新,而且比它更好。我正在考虑与包装函数相同的行。感谢您指出我的误解所在,以及您的指导,使我们的工作成为可能,同时我也学到了一些能够帮助我未来的事情!我的问题解决了,我的ajax没有被缓存! – KjetilNordin

0

请让我们知道您正在使用IE8作为该请从jQuery的单证检查以下

缓存(默认值:true,false为的dataType“脚本”和“JSONP”) 类型:Boolean 如果设置为false,它会强制请求的页面不被浏览器缓存。注意:将缓存设置为false只能在HEAD和GET请求中正常工作。它通过在GET参数中附加“_ = {timestamp}”来工作。 其他类型的请求不需要此参数,除了在IE8中对GET已请求的URL进行POST时除外。

+0

使用IE10 ..... – KjetilNordin

0

使用

$.ajaxSetup({ cache: false }); 

你不需要虚假缓存您的要求。将此代码用作头脑中的脚本。它会解决你的缓存问题。典想,

所有的
<script>$.ajaxSetup({ cache: false });</script> 
+0

这应该工作。我不知道为什么我不能在我的情况下工作。根据官方文档,这种方法的缺点以及为什么我放弃了我的尝试,是不鼓励使用$ .ajaxSetup。这些设置是全球性的,可以被任何人覆盖。 – KjetilNordin

0

有HTML代替您到$.getJSON()通话META标签缓存..我不确定,但可能有助于防止缓存。

<meta http-equiv='cache-control' content='no-cache'> 
<meta http-equiv='expires' content='0'> 
<meta http-equiv='pragma' content='no-cache'> 
+0

我已经在其他答案中看到过这个,并且已经在我的代码中,但事实证明这与我的具体情况无关。 – KjetilNordin

相关问题