为澄清起见:我不试图在刷新和重新加载之间进行区分,因此这不是refresh vs reload的重复。我试图找出是否有一种方法可以检测用户何时触发hard reload而不是正常的重新加载。我问是因为我只想在 hard 重新加载之前执行一些代码。
使用JavaScript,通过浏览器的重新加载按钮,或通过 Shift + Ctrl + R 之类的快捷方式,可以执行硬重新加载浏览器标签。是否有可能用JavaScript检测到这样的 hard 重新加载,如果可以,怎么办?
我知道有人可以检测到onbeforeunload
事件何时触发了正常的重载事件,并且我可以找到导航类型以区分刷新和重载,但是我无法检测到硬重载。 / p>
到目前为止,我正在使用以下JS代码检测重新加载:
window.addEventListener('beforeunload', function (e) {
// Cancel the event
e.preventDefault();
// Chrome requires returnValue to be set
e.returnValue = '';
// For older browsers
console.log('Is reloading?', event.currentTarget.performance.navigation.type === 1);
// For modern browsers
const perfEntries = performance.getEntriesByType("navigation");
for (let i = 0; i < perfEntries.length; i++) {
console.log('Is reloading? ', perfEntries[i].type === 1);
}
});
我希望能够区分正常重载,例如location.reload()
和强制重载,例如location.reload(true)
。
答案 0 :(得分:3)
您无法在javascript中检测到硬刷新,因为无法访问当前加载页面的标题。
J avaScript的问题在于它没有304的概念。它开始在网页的上下文中执行,但不知道页面本身或页面如何到达。
但是,服务器可以从请求标头中得知这是否是一次强制刷新,因此可以选择进行协作。例如,服务器可以在响应中包含一个自定义<meta>
标记,或者向<body>
添加一个特殊类,然后您的脚本将可以访问此信息。
另一种选择是基于浏览器/操作系统拦截按键组合,并在触发硬刷新(在url上附加内容,设置cookie或local / sessionstorage属性)之前执行操作