javascript - 仅当用户实际关闭选项卡时,我如何运行 Javascript 代码?
问题描述
当用户关闭我的页面时,我正在尝试运行一些 JS 代码。我在网上找到了这个:
window.addEventListener('beforeunload', (event) => {
event.returnValue = null
console.log("unload")
});
当我尝试在我的文档中使用此代码关闭我的页面时,Chrome 会给我一个对话框并询问“离开网站?您所做的更改可能不会被保存”,并带有“离开”和“取消”选项。它也运行console.log
,所以它似乎工作正常,对吧?但是,在console.log
出现提示的同时运行。所以我不知道用户实际上关闭了网站,因为据我所知,他们本可以点击取消。如果我知道用户实际上关闭了页面,我只想运行我的代码。
如果可能的话,我真的更愿意避免使用 WebSockets,或者进行某种连续轮询以检查用户是否仍在页面上。但是,如果真的没有其他方法可以做到这一点,我可能会诉诸其中一种方法,但我真的希望有另一种方法可以做到这一点。
有任何想法吗?
编辑:我实际上并不关心触发beforeunload
事件的原因。例如,用户可能会单击浏览器中的关闭按钮,他们可能会刷新页面,可能会单击链接,或者可能会在浏览器中键入另一个 URL。我不在乎。如果他们在出现的提示上单击取消,我只是不想运行我的代码,因为他们实际上并不会真正卸载页面。另外,我没有做任何侵入性的事情,只是在幕后做一些数据库的事情,所以如果代码在页面关闭后以某种方式运行也没关系(我想我记得一些关于sendBeacon
或能够做到这一点的东西,但我'不确定),或者如果根本没有出现提示也可以,它只是运行我的代码然后关闭页面。
解决方案
顾名思义,此事件发生在页面卸载之前,并允许用户取消卸载。
使用unload
事件侦听器来检测页面何时真正被卸载。如果你有两个事件监听器,这只会在用户选择时运行Leave
。
推荐阅读
- kotlin - 如何从 Kotlin 中的“apply”访问 variable.isInitialized?
- xml - 在 XML 中过度使用 CDATA?
- android - 如何在 Fragment Here Map API 中使用 MapFragment
- java - 复制构造函数是否进行浅拷贝?
- python-3.x - ModuleNotFoundError:没有命名的模块
- javascript - 使用javascript更改输入[复选框或单选按钮]时如何获取(或触发)更改事件
- mysql - 选择所有具有确切字段的内容
- ruby-on-rails - 使用 capistrano 部署时找不到 gem
- javascript - JavaScript:尝试在(.properties)文件中编写两个通用方法来读取(获取)和写入(设置)属性()
- javascript - Angular HttpParams 到对象,Object.defineProperty 创建属性但超出范围