$.getJSON 在 IE8 中返回缓存数据

Posted

技术标签:

【中文标题】$.getJSON 在 IE8 中返回缓存数据【英文标题】:$.getJSON returning cached data in IE8 【发布时间】:2010-09-20 19:45:09 【问题描述】:

我目前正在使用 ASP.net MVC 和 JQuery。我遇到了似乎没有意义的行为。

我正在调用 JQuery 的 $.getJSON 函数来填充一些 div。该事件在$(document).ready 事件上触发。这非常有效。

有一个小的AJAX.BeginForm 添加另一个值,以便在填充 div 时使用。它正确调用远程函数,并在成功后调用原始 javascript 函数来重新填充 div。

这是奇怪的部分:在 FireFox 和 Chrome 中 - 一切正常。但在 IE8 (Beta) 中,第二次调用填充 Div 脚本(调用 $.getJSON 函数)获取缓存数据并且不询问服务器!

希望这个问题有意义:简而言之 - 为什么$.getJSON 获取缓存数据?为什么它只影响 IE8?

【问题讨论】:

奇怪的是,我不仅在 IE 中看到了这个 bug,在 Firefox 中也看到了。在 jquery 中禁用 ajax 缓存对我有帮助。 【参考方案1】:

这就是它对我的工作方式......

$.ajaxSetup( cache: false );
$.getJSON("/MyQueryUrl",function(data,item) 
     // do stuff with callback data
     $.ajaxSetup( cache: true );
   );

【讨论】:

我一直在努力解决这个问题,而您的解决方案提供了一种快速解决方法。 :) 我有一个问题,你知道 $.ajaxSetup 可以使用哪些选项吗?遗憾的是,jQuery 文档没有提供详细信息... 可用选项与 $.ajax 相同,请参阅docs.jquery.com/Ajax/jQuery.ajax#options 了解更多信息 对上面代码的一点警告 - 它包含竞争条件。因为调用和它的响应是异步的,你应该在getJSON()之后调用$.ajaxSetup( cache: true );而不是在回调中。【参考方案2】:

只是让您知道,Firefox 和 Chrome 将所有 Ajax 请求视为不可缓存。 IE(所有版本)将 Ajax 调用视为其他 Web 请求。这就是您看到这种行为的原因。 如何在每次请求时强制 IE 下载数据:

如你所说,在 JQuery 中使用 'cache' 或 'nocache' 选项 向请求中添加一个随机参数(丑陋,但有效:)) 在服务器端,设置可缓存性(例如使用属性,见下文)

代码:

public class NoCacheAttribute : ActionFilterAttribute

    public override void OnActionExecuted(ActionExecutedContext context)
    
        context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    

【讨论】:

这个解决方案很吸引我。我真的很喜欢在 MVC 中应用属性的优雅 现在有一个OutputCacheAttribute OOTB。 @bzlm 但这更容易搜索 查看formatinternet.wordpress.com/2010/01/14/… 获取客户端解决方案 其实反之亦然,但我同意作为开发者IE需要耐心:)【参考方案3】:

感谢肯特的回答。 使用 $.ajax(' cache: no ');完美地工作。 [编辑]

或者至少我认为我做到了。似乎 jquery $.getJSON 没有读取对 $.ajax 对象所做的任何更改。

最终解决的办法是手动添加一个新参数

var noCache = Date();
$.getJSON("/somepage/someaction",  "noCache": noCache , Callback);

日期分辨率仅为分钟;这实际上意味着该解决方案仍会缓存长达一分钟。这对我来说是可以接受的。

【讨论】:

var noCache = new Date().getTime(); //会给你ms 感谢斯昆利夫! - 我对 javascript 很陌生,ASP MVC 为我打开了新的视野 你也可以试试 Math.Random()。 @Falkayn - 可以使用强硬的Math.Random(),它的结果将是未知的,您可能会连续两次(或更多)获得相同的数字。使用new Date().getTime() 将确保它永远不会重复。 (除非你能回到过去;))【参考方案4】:

我通过在控制器中的 Action 上放置以下属性解决了同样的问题:

[OutputCache(Duration = 0, VaryByParam = "None")]

【讨论】:

太棒了!很高兴有替代品(我选择了这个)。感谢所有贡献者! 适用于 Asp.Net MVC 4.0【参考方案5】:

如果您使用的是 ASP.net MVC,请考虑添加一个扩展方法以轻松实现无缓存,如下所示:

    public static void NoCache(this HttpResponse Response)
    
        Response.Cache.SetNoStore();
        Response.Cache.SetExpires(DateTime.MinValue);
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetValidUntilExpires(false);

        Response.Expires = -1;
        Response.ExpiresAbsolute = DateTime.MinValue;
        Response.AddHeader("Cache-Control", "no-cache");
        Response.AddHeader("Pragma", "no-cache");
    

【讨论】:

好主意 - 所以你在回调期间调用服务器上的这个扩展方法对吗?【参考方案6】:

您可能需要发送缓存破坏程序。

我建议使用 $.ajax( cache: no ) 以防万一(在获取请求中添加随机后缀)

(这些天我倾向于在任何地方使用 $.ajax,更可调整)

【讨论】:

感谢您的回答!...我还没有尝试过。将很快提供反馈【参考方案7】:

准备好回答了吗?

http://lestopher.tumblr.com/post/21742012438/if-youre-using-ie8-and-getjson

所以,只需添加

jQuery.support.cors = true;  

在您的脚本开头,然后 BANG 就可以了!

【讨论】:

以上是关于$.getJSON 在 IE8 中返回缓存数据的主要内容,如果未能解决你的问题,请参考以下文章

jQuery的$.getJSON方法在IE浏览器下失效的解决方案

在 IE8 中意外缓存 AJAX 结果

ie8 下使用iframe内容不更新一直读取缓存怎么办

jQuery的get()post()getJson()方法

ie浏览器下,get请求缓存问题

清除IE8/IE9/IE10/IE11浏览器缓存文件 100%有效