如何通过JavaScript强制web浏览器对页面进行硬刷新? 硬刷新意味着获取页面的新副本,并刷新所有外部资源(图像、JavaScript、CSS等)。


当前回答

⚠️此解决方案并不适用于所有浏览器。location.reload()的MDN页面: 注意:Firefox支持location.reload()的非标准forceGet布尔参数,它告诉Firefox绕过缓存并强制重载当前文档。但是,在所有其他浏览器中,您在location.reload()调用中指定的任何参数都将被忽略,并且没有任何类型的影响。

Try:

location.reload(true);

当此方法接收到一个真值作为参数时,它将导致页面总是从服务器重新加载。如果为false或未指定,浏览器可能会从缓存中重新加载页面。

更多信息:

location对象

其他回答

window.location.href = window.location.href

我发现的最可靠的方法是通过向查询字符串添加值来使用chache buster。

下面是我常用的一个常规程序:

    function reloadUrl() {

        // cache busting: Reliable but modifies URL
        var queryParams = new URLSearchParams(window.location.search);
        queryParams.set("lr", new Date().getTime());        
        var query = queryParams.toString();                
        window.location.search = query;  // navigates
    }

调用这个函数会产生如下结果:

https://somesite.com/page?lr=1665958485293

重载后。

这可以强制每次重新加载,但需要注意的是URL会更改。在大多数应用程序中,这并不重要,但如果服务器依赖于特定的参数,这可能会导致潜在的副作用。

⚠️此解决方案并不适用于所有浏览器。location.reload()的MDN页面: 注意:Firefox支持location.reload()的非标准forceGet布尔参数,它告诉Firefox绕过缓存并强制重载当前文档。但是,在所有其他浏览器中,您在location.reload()调用中指定的任何参数都将被忽略,并且没有任何类型的影响。

Try:

location.reload(true);

当此方法接收到一个真值作为参数时,它将导致页面总是从服务器重新加载。如果为false或未指定,浏览器可能会从缓存中重新加载页面。

更多信息:

location对象

UPDATED刷新所有外部资源(图像,JavaScript, CSS等)

把这个放到名为HardRefresh.js的文件中:

  function hardRefresh() {
    const t = parseInt(Date.now() / 10000); //10s tics
    const x = localStorage.getItem("t");
    localStorage.setItem("t", t);

    if (x != t) location.reload(true) //force page refresh from server
    else { //refreshed from server within 10s
      const a = document.querySelectorAll("a, link, script, img")
      var n = a.length
      while(n--) {
        var tag = a[n]
        var url = new URL(tag.href || tag.src);
        url.searchParams.set('r', t.toString());
        tag.href = url.toString(); //a, link, ...
        tag.src = tag.href; //rerun script, refresh img
      }
    }
  }

  window.addEventListener("DOMContentLoaded", hardRefresh);
  window.addEventListener("deviceorientation", hardRefresh, true);

这段代码对每个访问者进行完全控制的强制硬刷新,这样任何更新都不会出现兑现问题。

复制DOM渲染不是一个性能问题,因为第一次渲染来自缓存,它在<script src="js/HardRefresh.js">中停止渲染,它从服务器重新加载页面。当它运行刷新页面时,它也刷新页面中的url。

最后一次刷新时间x存储在localStorage中。与当前时间t比较,刷新时间在10秒内。假设来自服务器的负载不超过10秒,我们设法停止页面刷新循环,所以不要让它少于10秒。

对于页面的访问者,x != t是真实的,因为很久以前或第一次访问;这将从服务器获取页面。然后diff小于10s, x == t,这将使else部分添加查询字符串到href和src有源刷新。

refresh()函数可以通过按钮或其他有条件的方式调用。完全控制是通过在代码中细化url的排除和包含来管理的。

这是2022年的更新,有2种方法,考虑到url中有#的SPA:

方法1:

正如在其他答案中提到的,一种解决方案是将一个随机参数放入查询字符串。在javascript中,它可以这样实现:

function urlWithRndQueryParam(url, paramName) {
    const ulrArr = url.split('#');
    const urlQry = ulrArr[0].split('?');
    const usp = new URLSearchParams(urlQry[1] || '');
    usp.set(paramName || '_z', `${Date.now()}`);
    urlQry[1] = usp.toString();
    ulrArr[0] = urlQry.join('?');
    return ulrArr.join('#');
}

function handleHardReload(url) {
    window.location.href = urlWithRndQueryParam(url);
    // This is to ensure reload with url's having '#'
    window.location.reload();
}

handleHardReload(window.location.href);

坏的部分是,它改变了当前的url,有时,在干净的url,它可能看起来有点难看的用户。

方法2:

从https://splunktool.com/force-a-reload-of-page-in-chrome-using-javascript-no-cache的想法来看,这个过程可以是先获得没有缓存的url,然后重新加载页面:

async function handleHardReload(url) {
    await fetch(url, {
        headers: {
            Pragma: 'no-cache',
            Expires: '-1',
            'Cache-Control': 'no-cache',
        },
    });
    window.location.href = url;
    // This is to ensure reload with url's having '#'
    window.location.reload();
}

handleHardReload(window.location.href);

甚至可以结合方法1,但我认为与头应该足够:

async function handleHardReload(url) {
    const newUrl = urlWithRndQueryParam(url);
    await fetch(newUrl, {
        headers: {
            Pragma: 'no-cache',
            Expires: '-1',
            'Cache-Control': 'no-cache',
        },
    });
    window.location.href = url;
    // This is to ensure reload with url's having '#'
    window.location.reload();
}

handleHardReload(window.location.href);