今日项目遇到一个问题,有一个功能会在浏览器的主窗口中新开一个窗口,然后业务要求:关闭新窗口的时候往后端发个请求,刷新的时候不发送。知道有个 onbeforeunload 事件是用于捕获关闭浏览器事件(包括刷新)的,但刷新也会走此方法,所以行不通,于是就网上找了找资料,网上回答的最多的大致是这样的
1 | window.onbeforeunload = function () { |
但是,这个方法是监听浏览器右上角的关闭事件的,我想要的是选项卡的关闭与刷新事件,下面我们先来分析一下关闭窗口相关的几个方法
页面关闭时先执行 onbeforeunload,然后 onunload
页面刷新时先执行 onbeforeunload,然后 onunload,最后 onload。
从上面的分析中,发现关闭与刷新都会走 onbeforeunload 与 onunload,如果我们认为用这两个方法无法区分关闭与刷新事件,那就大错特错了,正因为关闭与刷新事件都会走 onbeforeunload 与 onunload,所以我们利用了一个关键点就能区分出这两种,那就是:时间差
最终解决方法
1 | var beginTime = 0;//执行onbeforeunload的开始时间 |
分析:虽然刷新与关闭都会走 onbeforeunload 与 onunload,但可能因为刷新在加载新页面前内部机制还需要做一些准备工作,所以刷新事件在执行到 onunload 事件时,用的时间会比关闭事件时间长,在我的测试页面中,页面里面没啥内容,关闭时 onbeforeunload 与 onunload 的时间差一般会在 3 毫秒内,而刷新事件的时间差一般会在 10 毫秒以上,当我真正用到项目中的时候(真正的项目页面中就有很多内容了),刷新事件的时间差竟能达到 100 毫秒左右,而关闭事件时间差还是 3 毫秒左右,这就大大保证了此方法的准确率,所以,判断浏览器窗口或者说是选项卡的关闭与刷新,此方法是比较合适的。
————————————————
版权声明:本文为 CSDN 博主「微行」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/itlsq/article/details/81095323