【问题标题】:$.getJSON returning cached data in IE8$.getJSON 在 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 缓存对我有帮助。

标签: jquery asp.net-mvc internet-explorer-8 getjson


【解决方案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 就可以了!

【讨论】:

    猜你喜欢
    • 2011-01-20
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多