使用JavaScript检测硬重装

时间:2019-01-04 13:46:48

标签: javascript browser reload

为澄清起见:试图在刷新和重新加载之间进行区分,因此这不是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)

1 个答案:

答案 0 :(得分:3)

您无法在javascript中检测到硬刷新,因为无法访问当前加载页面的标题。

J avaScript的问题在于它没有304的概念。它开始在网页的上下文中执行,但不知道页面本身或页面如何到达。

但是,服务器可以从请求标头中得知这是否是一次强制刷新,因此可以选择进行协作。例如,服务器可以在响应中包含一个自定义<meta>标记,或者向<body>添加一个特殊类,然后您的脚本将可以访问此信息。

另一种选择是基于浏览器/操作系统拦截按键组合,并在触发硬刷新(在url上附加内容,设置cookie或local / sessionstorage属性)之前执行操作