javascript - 使用 JavaScript 检测硬重新加载
问题描述
澄清一下:我不想区分刷新和重新加载,因此这不是refresh vs reload的重复。我试图找出是否有办法检测用户何时触发硬重新加载而不是正常重新加载。我问是因为我只想在硬重新加载之前执行一些代码。
使用 JavaScript,通过浏览器的重新加载按钮,或通过 ++ 之类的快捷方式Shift,Ctrl可以R执行浏览器选项卡的硬重新加载。是否可以使用 JavaScript检测到这样的硬重新加载,如果可以,如何检测?
我知道可以检测到事件何时触发了正常的重新加载事件,onbeforeunload
并且我可以找出导航类型以区分刷新和重新加载,但我无法检测到硬重新加载。
到目前为止,我正在使用以下 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)
。
解决方案
您无法在 javascript 中检测到硬刷新,因为无法访问当前加载页面的标题。
J avaScript 的问题在于它没有 304 的概念。它开始在网页的上下文中执行,但它不知道自己或页面是如何到达那里的。
但是,服务器可以从请求标头中判断这是否是硬刷新,因此可以选择合作。例如,服务器可以<meta>
在响应中包含自定义标记或添加特殊类,<body>
然后您的脚本将可以访问此信息。
另一种选择是拦截基于浏览器/操作系统的组合键并在触发硬刷新之前采取行动(将某些内容附加到 url,设置 cookie 或本地/会话存储属性)
推荐阅读
- python - BeautifulSoup:查找多个嵌套元素的类值
- flutter - 动画脚手架背景颜色
- javascript - 通过 ajax 发送的数据格式错误
- javascript - Firestore 从单个文档纯 JS 中获取所有字段
- sql - 如果外键表中不存在外键,如何选择记录
- rest - ASP.NET Core 3.1 Web 应用程序,错误“无法连接到 Web 服务器“IIS Express”
- php - 如何比较和更新基于 Laravel 中另一个 Collection 的 Eloquent Collection
- php - HTML 中的样式 PHP 变量
- java - 如何从 RecyclerView 获取值
- python - OverflowError: Python int too large to convert to C long in python but date is defined as datetime64[ns] type object