检查页面是否在 JavaScript 中重新加载或刷新

IT技术 javascript page-refresh
2021-01-10 06:50:45

我想检查何时有人尝试刷新页面。

例如,当我打开一个页面时什么也没有发生,但是当我刷新页面时它应该显示一个警报。

6个回答

⚠️⚠️⚠️window.performance.navigation.type已弃用,请参阅Илья Зеленько 的回答


了解页面实际重新加载的更好方法是使用大多数现代浏览器支持的导航器对象。

它使用导航计时 API

//check for Navigation Timing API support
if (window.performance) {
  console.info("window.performance works fine on this browser");
}
console.info(performance.navigation.type);
if (performance.navigation.type == performance.navigation.TYPE_RELOAD) {
  console.info( "This page is reloaded" );
} else {
  console.info( "This page is not reloaded");
}

来源:https : //developer.mozilla.org/en-US/docs/Web/API/Navigation_timing_API

请注意。Chrome 最近改变了这种行为。当用户点击当前地址栏并回车时,performance.navigation.type 的值将是 1,应该是 0。我在 56 版中测试过。不知道为什么。
2021-03-14 06:50:45
谢谢伙计,这是检测页面是从浏览器的右键单击/刷新重新加载还是通过 url 重新加载的准确解决方案。
2021-03-21 06:50:45
⚠️⚠️⚠️window.performance.navigation.type已弃用,请看我的回答
2021-03-30 06:50:45
performance.navigation.type == performance.navigation.TYPE_RELOAD更容易阅读而不是== 1. 此外,如果您检查,performance.navigation您会发现有 4 种不同的导航类型,例如TYPE_BACK_FORWARDTYPE_NAVIGATE
2021-04-02 06:50:45
他们的工作方式正如预期的那样,与页面的任何交互都将新的导航状态强制到同一页面被视为刷新。因此,根据您的代码,这非常有用,可以在每次页面刷新、重新加载或任何 ajax 交互时进行注册。我可以给它很多功能和分析的用途。
2021-04-09 06:50:45

新标准 2018-现在(PerformanceNavigationTiming)

window.performance.navigation属性导航计时级别 2规范中已弃用请改用接口。PerformanceNavigationTiming

PerformanceNavigationTiming.type

这是一项实验技术

在生产中使用它之前,仔细检查浏览器兼容性表

检查页面是否在 JavaScript 中重新加载或刷新

const pageAccessedByReload = (
  (window.performance.navigation && window.performance.navigation.type === 1) ||
    window.performance
      .getEntriesByType('navigation')
      .map((nav) => nav.type)
      .includes('reload')
);

alert(pageAccessedByReload);

支持 2021-11-09

支持表

type 只读属性返回一个表示导航类型的字符串。该值必须是以下之一:

  • 导航- 通过单击链接、在浏览器的地址栏中输入 URL、提交表单或通过脚本操作初始化而不是 reload 和 back_forward 开始导航,如下所列。

  • 重新加载- 导航是通过浏览器的重新加载操作或location.reload().

  • back_forward — 导航是通过浏览器的历史遍历操作。

  • 预渲染- 导航由预渲染提示启动

此属性为只读。

以下示例说明了此属性的用法。

function print_nav_timing_data() {
  // Use getEntriesByType() to just get the "navigation" events
  var perfEntries = performance.getEntriesByType("navigation");

  for (var i=0; i < perfEntries.length; i++) {
    console.log("= Navigation entry[" + i + "]");
    var p = perfEntries[i];
    // dom Properties
    console.log("DOM content loaded = " + (p.domContentLoadedEventEnd - p.domContentLoadedEventStart));
    console.log("DOM complete = " + p.domComplete);
    console.log("DOM interactive = " + p.interactive);
 
    // document load and unload time
    console.log("document load = " + (p.loadEventEnd - p.loadEventStart));
    console.log("document unload = " + (p.unloadEventEnd - p.unloadEventStart));
    
    // other properties
    console.log("type = " + p.type);
    console.log("redirectCount = " + p.redirectCount);
  }
}
@kennysong 在 jsfiddle 之外或在您的开发工具中尝试
2021-03-13 06:50:45
感谢您指出这一点所以这是完全兼容的解决方案:jsfiddle.net/j9o1khcw/2
2021-03-20 06:50:45
@0nline 我试过你的解决方案,但它对我不起作用仅供参考。
2021-03-24 06:50:45
+1 指出了已弃用的 API,但 Apple 因在 2020 年仍缺乏对 iOS 的支持而给予 -100
2021-03-27 06:50:45

第一步是检查sessionStorage一些预定义的值,如果它存在警报用户:

if (sessionStorage.getItem("is_reloaded")) alert('Reloaded!');

第二步是设置sessionStorage某个值(例如true):

sessionStorage.setItem("is_reloaded", true);

会话值一直保留到页面关闭,因此只有在站点的新选项卡中重新加载页面时,它才会工作。您也可以以相同的方式保持重新加载计数。

请注意,如果您关闭选项卡并从 ctrl+shift+T 恢复它,则 sessionStorage 恢复 当需要清理会话令牌时,这可能会导致公共场所的安全漏洞
2021-03-15 06:50:45
需要注意的两件事:1)。您只能在会话和本地存储中存储字符串值。因此true转换为"true". 2)。会话存储会一直持续到用户关闭浏览器窗口,因此您无法区分页面重新加载与在同一浏览器会话中离开和返回站点之间的区别。
2021-03-28 06:50:45
SessionStorage 可以在浏览器中修改吗?如果我错了纠正我。有人可以添加/删除密钥,并且可以绕过您的逻辑/代码。
2021-04-01 06:50:45

在有人第一次访问该页面时存储一个 cookie。刷新时检查您的 cookie 是否存在,如果存在,则发出警报。

function checkFirstVisit() {
  if(document.cookie.indexOf('mycookie')==-1) {
    // cookie doesn't exist, create it now
    document.cookie = 'mycookie=1';
  }
  else {
    // not first visit, so alert
    alert('You refreshed!');
  }
}

在你的身体标签中:

<body onload="checkFirstVisit()">
就像@Rob2211 说的那样,这只会检查页面是否已被访问过,并且只要在 cookie 仍然存在的情况下重新访问页面,就会给出误报。不要使用它来检查刷新。
2021-03-19 06:50:45
@techfoobar 不错的收获。如果用户在该 cookie 被销毁之前重新访问该站点,这是否仍然会造成问题?
2021-03-20 06:50:45
回头客呢?
2021-03-23 06:50:45
@Brannon - 创建的 cookie 没有任何过期值,将在浏览器关闭时销毁。
2021-03-26 06:50:45
@Brannon - 是的,如果浏览器保持打开状态并且用户在一段时间后重新访问,则不会将其视为新访问。
2021-03-26 06:50:45

我编写了这个函数来同时使用旧的window.performance.navigation和新的方法检查两种方法performance.getEntriesByType("navigation")

function navigationType(){

    var result;
    var p;

    if (window.performance.navigation) {
        result=window.performance.navigation;
        if (result==255){result=4} // 4 is my invention!
    }

    if (window.performance.getEntriesByType("navigation")){
       p=window.performance.getEntriesByType("navigation")[0].type;

       if (p=='navigate'){result=0}
       if (p=='reload'){result=1}
       if (p=='back_forward'){result=2}
       if (p=='prerender'){result=3} //3 is my invention!
    }
    return result;
}

结果说明:

0:点击链接,在浏览器地址栏中输入网址,提交表单,点击书签,通过脚本操作初始化。

1:单击重新加载按钮或使用Location.reload()

2:使用浏览器历史记录(Bakc 和 Forward)。

3:预渲染活动如<link rel="prerender" href="//example.com/next-page.html">

4:任何其他方法。

这在 safari 中不起作用。返回的数组为空。
2021-03-13 06:50:45
在网上找到的最佳解决方案。有效!!谢谢
2021-03-24 06:50:45