添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
7
需求背景: 为保证‘高度安全性’,用户每次退出页面或浏览器都要清除登陆信息,每次进入系统都要重新登陆(每次登陆还要手机验证码等乱七八糟的验证信息,,,求用户的心里阴影面积),但是刷新页面不可以清除登陆信息。
解决思路: javascript 对于浏览器的关闭和刷新会触发两个事件 onbeforeunload() onunload() ,问题在于如何区分用户是想刷新还是退出(此时应该将用户催眠,然后获得用户的思想,预判用户走位及操作。。。),本文主要记录这两个方法的区别,设备兼容性及如何催眠用户(开玩笑的),是如何区分刷新和退出浏览器

onbeforeunload()和onunload()

onbeforeunload 和 onunload 都是在页面刷新或退出时触发的事件
onunload window.onunload=function(){SomeJavaScriptCode}; onbeforeunload window.onbeforeunload=function(){SomeJavaScriptCode}; unbeforeunload() 是在页面刷新或关闭之前触发的事件,而 onubload() 是在页面刷新或关闭之后才会触发的。 unbeforeunload() 事件执行的顺序在 onunload() 事件之前发生。 unbeforeunload() 事件可以禁止 onunload() 事件的触发。 onunload() 事件是无法阻止页面关闭的。

兼容性(pc):

Chrome Firefox Opera Safari onunload onbeforeunload

注意:onbeforeunoad 在移动端基本都不兼容,onunload则兼容大部分主流移动端浏览器

参考文献:
MDN: window.onbeforeunload
MDN: window.onunload

区分刷新和退出

在浏览器关闭前是无法判断用户是刷新还是退出,所以我们在用户再次打开的时候来判断用户是否刷新

解决思路:

  • 用户关闭浏览器时,记录当前时间,并存于浏览器缓存中
  • 用户再次打开页面时,获取上次退出的时间,并于当前时间进行比较,若小于5s则表示用户执行的是刷新操作,若大于5s则判定为退出
  • 注意: 5s并非固定,要根据实际情况调整

    // 进入页面执行
    // 记录当前时间并转成时间戳
    const now = new Date().getTime();
    // 从缓存中获取用户上次退出的时间戳
    const leaveTime = parseInt(localStorage.getItem('leaveTime'), 10);
    // 判断是否为刷新,两次间隔在5s内判定为刷新操作
    const refresh = (now - leaveTime) <= 5000;
    // 测试alert
    alert(refresh ? '刷新' : '重新登陆');