如何通过JavaScript强制web浏览器对页面进行硬刷新? 硬刷新意味着获取页面的新副本,并刷新所有外部资源(图像、JavaScript、CSS等)。
当前回答
window.location.href = window.location.href
其他回答
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的排除和包含来管理的。
⚠️此解决方案并不适用于所有浏览器。location.reload()的MDN页面: 注意:Firefox支持location.reload()的非标准forceGet布尔参数,它告诉Firefox绕过缓存并强制重载当前文档。但是,在所有其他浏览器中,您在location.reload()调用中指定的任何参数都将被忽略,并且没有任何类型的影响。
Try:
location.reload(true);
当此方法接收到一个真值作为参数时,它将导致页面总是从服务器重新加载。如果为false或未指定,浏览器可能会从缓存中重新加载页面。
更多信息:
location对象
window.location.href = window.location.href
这是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);
上面接受的答案不再做任何事情,除了在大多数新版本的web浏览器上正常重新加载。我已经在我最近更新的Chrome上尝试了所有这些,包括location.reload(true), location。Href = location。/>. href, and <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"没有一个成功。
我的解决方案是通过使用服务器端功能将非重复查询字符串附加到所有包含的源文件引用,如下例所示。
< src = "脚本。js脚本吗? =时间();t = < ?> > < /脚本”>
因此,您还需要动态地控制何时保留以前的文件,何时更新它。唯一的问题是,当文件包含通过脚本由插件执行时,你无法控制修改它。不要担心源文件泛滥。当旧文件被解除链接时,它将自动被垃圾收集。
推荐文章
- 我如何使用Jest模拟JavaScript的“窗口”对象?
- 我如何等待一个承诺完成之前返回一个函数的变量?
- 在JavaScript中根据键值查找和删除数组中的对象
- 使嵌套JavaScript对象平放/不平放的最快方法
- 如何以及为什么'a'['toUpperCase']()在JavaScript工作?
- 有Grunt生成index.html不同的设置
- 文档之间的区别。addEventListener和window。addEventListener?
- 如何检查动态附加的事件监听器是否存在?
- 如何写setTimeout与参数Coffeescript
- 将JavaScript字符串中的多个空格替换为单个空格
- JavaScript: override alert()
- 重置setTimeout
- 如何确保<select>表单字段被禁用时提交?
- jQuery有不聚焦的方法吗?
- 反应钩子-正确的方式清除超时和间隔