22

我需要使用 JavaScript 重新加载页面,并确保它不会从浏览器缓存中提取,而是从服务器重新加载页面。[因为页面的元素将在此期间发生变化]

在 IE 和 FF 上,我发现以下代码运行良好;

window.location.reload(true);

但是它不适用于 Chrome 或 Safari。

我尝试了以下方法,但也无济于事;

window.location.replace(location.href);
document.location.reload(true);
document.location.replace(location.href);

这个问题有解决方案吗?

发现

经过调查,我发现这个问题是 HTTP 协议处理;

  1. Chrome 发送带有Pragma: no-cacheHTTP 字段的请求
  2. 服务器响应Last-Modified: DATE1字段
  3. JS 用于location.reload(true)强制从服务器重新加载而不是缓存
  4. Chrome 发送带有If-Modified-Since: DATE1字段的请求
  5. 服务器响应HTTP Status 304 Not Modified

服务器应用程序因没有注意到动态页面内容中的状态变化而导致错误,因此没有返回200. If-Modified-Since但是,Chrome/WebKit 是唯一在调用JS 时发送字段的浏览器location.reload(true)

我想我会把我的发现放在这里,以防其他人遇到同样的问题。

4

5 回答 5

16

你可以使用这个技巧:

 $.ajax({
        url: window.location.href,
        headers: {
            "Pragma": "no-cache",
            "Expires": -1,
            "Cache-Control": "no-cache"
        }
    }).done(function () {
        window.location.reload(true);
    });
于 2014-11-21T09:45:42.633 回答
8

为确保页面未从缓存中加载,您可以添加一些唯一编号进行查询:

window.location = location.href + '?upd=' + 123456;

您也可以使用日期而不是 123456

于 2012-05-23T12:08:32.810 回答
1

伟大的发现!我刚刚遇到了同样的问题,这真的很有帮助!但是,除了您的发现之外,Chrome 似乎总是向 location.reload() 发送 GET 请求...IE/FF 正在重复最后一个请求。

于 2012-07-18T07:00:32.680 回答
1

这是我为确保在 chrome 上强制重新加载我的应用程序文件所做的工作:

    var oAjax = new XMLHttpRequest;
    oAjax.open( 'get', '/path/to/my/app.js' );
    oAjax.setRequestHeader( 'Pragma', 'no-cache' );
    oAjax.send();
    oAjax.onreadystatechange = function() {
        if( oAjax.readyState === 4 ) {
            self.location.reload();
        }
    }
于 2017-04-25T08:59:09.907 回答
0

尝试window.location = window.location

于 2012-05-23T12:05:32.040 回答