如何通过JavaScript强制web浏览器对页面进行硬刷新? 硬刷新意味着获取页面的新副本,并刷新所有外部资源(图像、JavaScript、CSS等)。
当前回答
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的排除和包含来管理的。
其他回答
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的排除和包含来管理的。
我发现的最可靠的方法是通过向查询字符串添加值来使用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会更改。在大多数应用程序中,这并不重要,但如果服务器依赖于特定的参数,这可能会导致潜在的副作用。
上面接受的答案不再做任何事情,除了在大多数新版本的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 = < ?> > < /脚本”>
因此,您还需要动态地控制何时保留以前的文件,何时更新它。唯一的问题是,当文件包含通过脚本由插件执行时,你无法控制修改它。不要担心源文件泛滥。当旧文件被解除链接时,它将自动被垃圾收集。
对于angular用户,你可以执行以下操作:
<form [action]="myAppURL" method="POST" #refreshForm></form>
import { Component, OnInit, ViewChild } from '@angular/core';
@Component({
// ...
})
export class FooComponent {
@ViewChild('refreshForm', { static: false }) refreshForm;
forceReload() {
this.refreshForm.nativeElement.submit();
}
}
它起作用的原因在这个网站上有解释:https://www.xspdf.com/resolution/52192666.html
在本文中,您还将了解到硬重载是如何为每个框架工作的
解释:角
Location: reload(), Location.reload()方法重载当前URL,就像Refresh按钮一样。只使用location.reload();如果你想执行强制重载(例如使用Ctrl + F5)来重载服务器而不是浏览器缓存中的所有资源,这不是一个解决方案。这个问题的解决方案是,执行一个POST请求到当前位置,因为这总是使浏览器重新加载所有内容。
window.location.href = window.location.href
推荐文章
- 我如何检查如果一个变量是JavaScript字符串?
- 如何检测如果多个键被按下一次使用JavaScript?
- 如何通过history. pushstate获得历史变化的通知?
- 使用jQuery改变输入字段的类型
- 在JavaScript中,什么相当于Java的Thread.sleep() ?
- 使用jQuery以像素为整数填充或边距值
- 检查是否选择了jQuery选项,如果没有选择默认值
- Next.js React应用中没有定义Window
- 如何重置笑话模拟函数调用计数之前,每次测试
- 如何强制一个功能React组件渲染?
- 在javascript中从平面数组构建树数组
- 将Dropzone.js与其他字段集成到现有的HTML表单中
- 如何在AngularJS中观察路由变化?
- JavaScript DOM删除元素
- 将dd-mm-yyyy字符串转换为日期