【问题标题】:What is the correct way to prevent caching on ajax calls?防止ajax调用缓存的正确方法是什么?
【发布时间】:2016-05-09 21:18:03
【问题描述】:

我有一个 AJAX 调用,它根据简单的标准参数(例如一年中的月份)从不断变化的数据库中返回值。在 IE 中,此函数返回缓存的数据,它永远不会。我监控了服务器端,客户端没有联系。

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

  • 设置cache: false
  • 传递一个随机数/字符串/时间戳以使调用唯一。

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

在防止缓存方面不起作用的 Ajax 调用:

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

我也尝试过在呼叫发生之前自己拨打$.ajaxSetup({ cache: false });,但没有效果...

【问题讨论】:

  • 在url中添加随机值参数
  • 您可以控制服务器端点吗?它返回什么缓存头?

标签: jquery ajax caching


【解决方案1】:

请让我们知道您是否使用 IE8,请从 jquery 文档中查看以下内容

缓存(默认:true,对于 dataType 'script' 和 'jsonp' 为 false) 类型:布尔值 如果设置为 false,它将强制浏览器不缓存请求的页面。注意:将缓存设置为 false 仅适用于 HEAD 和 GET 请求。它通过将“_={timestamp}”附加到 GET 参数来工作。 其他类型的请求不需要该参数,除非在 IE8 中对已由 GET 请求的 URL 进行 POST。

【讨论】:

    【解决方案2】:

    使用

    $.ajaxSetup({ cache: false });
    

    您不需要在请求中进行虚假缓存。将此代码用作您脑海中的脚本。它将解决您的缓存问题。代码应该喜欢,

    <script>$.ajaxSetup({ cache: false });</script>
    

    【讨论】:

    • 这应该可以。我不知道为什么我不能让它在我的情况下工作。根据官方文档,这种方法的缺点以及我放弃尝试的原因是不鼓励使用 $.ajaxSetup。这些设置是全局的,任何人都可以覆盖。
    【解决方案3】:

    首先,您认为在 $.getJSON() 调用中将 cache 设置为 false 的方式不正确。您将键/值对传递给服务器,因此请求 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()替换你对$.getJSON()的调用

    【讨论】:

    • 啊啊!现在我得到了 $.ajax-parameters 和 $.getJSON 参数之间的区别。但是:$.ajaxSetup({ cache: false }); 后跟 $.getJSON(... 应该可以工作,不是吗?我现在看到文档中不鼓励使用 ajaxSetup。我可能会使用上面的示例。如果可行,我会接受答案:) 谢谢。
    • 使用$.ajaxSetup 全局设置它应该可以工作,但您发现不鼓励这样做,并且任何其他脚本都可能覆盖它,因此不应依赖它。
    • 我看到答案现在更新了,而且比以前更好了。我的想法与包装函数相同。感谢您指出我的误解在哪里,以及您的指导使其发挥作用,同时我实际上学到了一些对我未来有帮助的东西!我的问题解决了,我的ajax没有缓存!
    【解决方案4】:

    有用于缓存的 HTML META TAG。我不确定,但可能对防止缓存有用。

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

    【讨论】:

    • 我已经在其他答案中看到过这个,它已经在我的代码中,但事实证明它与我的具体情况无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 2014-12-31
    • 2019-01-14
    • 2011-11-19
    相关资源
    最近更新 更多