在JavaScript中,有没有一种方法可以检测卸载事件是通过刷新、后退按钮还是关闭浏览器引起的?

31

我正在研究窗口的 "unload" 事件,试图确定该事件是如何触发的,但没有成功。是否有一种方法可以确定JavaScript事件是如何触发的?

  • 页面刷新
  • 返回按钮(或离开页面)
  • 关闭浏览器

本质上,我需要在浏览器窗口关闭时才执行一些代码,而不是在刷新或离开页面时。

目的: 当客户更新我们的软件时,更新将把他们的第一个互联网请求重定向到一个优惠页面。有一个“不打扰”的选项按钮,但有些用户会直接关闭浏览器。在关闭浏览器时,我需要复制“不打扰”功能,使用户不再被重定向到优惠页面。仅依附于“unload”事件将无法使用,因为离开页面的方式不同。

3个回答

14
不会,如果有的话它就取决于浏览器。 当用户关闭页面时,您要运行什么样的代码? 是为了注销用户? 那么,如果浏览器崩溃或网络连接断开(并且可能不会在计算机进入睡眠/休眠模式时),用户将无法注销。 如果是出于注销目的,您应该在服务器上使用一个时间戳变量,在每个请求中进行更新(或使用ajax-ping),如果一段时间没有看到该用户,则注销该用户。 更新:在stackoverflow上找到了这个答案

2

-4

我使用一种键盘“嗅探”的方法,它寻找“F5”、“ctrl+r”、“alt-f4”、“backspace”和其他按键的keydown事件,如果在键盘事件队列中发现它们,则适当地设置布尔变量以捕获该状态...然后我使用一个“onbeforeunload”函数处理程序,它根据这些布尔状态变量来决定要做什么。

你甚至可以通过在键盘处理中使用preventDefault()、bubbles=false和returnValue=false来关闭各种键盘击键(例如“ctrl+n”或“F1”)。

这些东西不是给胆小者的,但通过一些坚持不懈和大量的跨浏览器测试,肯定是可行的!


5
使用鼠标点击关闭按钮时完全无效。 - deceze
为什么会有这么多的踩?这是一个完全可行的解决方案!@deceze 用鼠标点击关闭按钮只会触发onbeforeunload事件,上面的答案并没有与此相矛盾。通过检查上述按键来检测页面重新加载的if语句和处理“用鼠标”关闭窗口的else语句应该能够解决你的问题。 - jahackbeth
2
@jahackbeth 问题是是否可能区分后退按钮、重新加载或窗口关闭之间的“页面卸载”。如果通过键盘触发操作,则可以做到这一点。我的批评是,如果通过GUI触发操作,这是不可能的,我认为这种情况很常见。 - deceze
@deceze 啊,没错!我没有注意到你的意思是浏览器的关闭和重新加载按钮的鼠标事件在JavaScript中无法区分。 - jahackbeth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接