$.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 中返回缓存数据的主要内容,如果未能解决你的问题,请参考以下文章