如何仅在用户实际关闭选项卡时运行Javascript代码?

如何仅在用户实际关闭选项卡时运行Javascript代码?,javascript,dom-events,addeventlistener,onbeforeunload,Javascript,Dom Events,Addeventlistener,Onbeforeunload,我试图在用户关闭我的页面时运行一些JS代码。我在网上找到了这个: window.addEventListener('beforeunload', (event) => { event.returnValue = null console.log("unload") }); 当我试图用文档中的此代码关闭页面时,Chrome会给我一个对话框,并询问“离开网站?您所做的更改可能无法保存”,选项为“离开”和“取消”。它还运行console.log,因此它似乎工作正

我试图在用户关闭我的页面时运行一些JS代码。我在网上找到了这个:

window.addEventListener('beforeunload', (event) => {
      event.returnValue = null
      console.log("unload")
    });
当我试图用文档中的此代码关闭页面时,Chrome会给我一个对话框,并询问“离开网站?您所做的更改可能无法保存”,选项为“离开”和“取消”。它还运行
console.log
,因此它似乎工作正常,对吗?但是,
console.log
与提示同时运行。所以我不知道用户是否真的关闭了这个网站,因为他们可能已经点击了取消。我只想在知道用户确实关闭了页面的情况下运行代码

我真的希望避免使用WebSocket,或者尽可能地进行某种连续轮询来检查用户是否仍在页面上。然而,如果真的没有其他方法可以做到这一点,我可能会求助于这些方法之一,但我真的希望有另一种方法可以做到这一点

有什么想法吗


编辑:我实际上并不关心是什么触发卸载前的
事件。例如,用户可以单击浏览器中的关闭按钮,刷新页面,单击链接,或者在浏览器中键入其他url。我不在乎。如果他们在出现的提示中单击cancel,我只是不想运行我的代码,因为这样他们根本不会卸载页面。另外,我没有做任何干扰性的事情,只是在后台做一些数据库的事情,所以如果代码在页面关闭后以某种方式运行也没关系(我想我记得一些关于
sendBeacon
的事情,或者一些能够做到这一点的事情,但我不确定),或者如果根本没有出现提示也没关系,它只运行我的代码,然后关闭页面。

顾名思义,此事件发生在页面卸载之前,允许用户取消卸载


使用事件侦听器检测页面何时实际被卸载。如果您有两个事件侦听器,则仅当用户选择了“离开”(顾名思义,此事件发生在页面卸载之前,并允许用户取消卸载)时,此事件才会运行


使用事件侦听器检测页面何时实际被卸载。如果您同时拥有两个事件侦听器,则只有在用户选择了“离开”时,才会运行此功能。没有直接的方法来检测浏览器是否关闭,但是您可以检查选项卡是否关闭。 您可以使用
onunload&onbeforeunload
这些事件

有关更多信息:

在您的情况下,可以使用
$(window).off('beforeunload')


有关详细信息:

没有直接的方法检测浏览器是否关闭,但是您可以检查选项卡是否关闭。 您可以使用
onunload&onbeforeunload
这些事件

有关更多信息:

在您的情况下,可以使用
$(window).off('beforeunload')


有关更多信息:

窗口api无法区分选项卡是否关闭或触发卸载的内容。你的具体用例是什么?啊,也许我应该更清楚一些。我不关心是什么触发了它,例如,我不关心用户是否真的单击了小关闭按钮,或者他们是否单击了另一个链接,或者他们是否刷新了,等等。我希望在所有这些情况下运行我的代码,只要我的文档将卸载。但是,如果他们在出现的提示中单击cancel,我不想运行代码,因为这样他们显然没有实际卸载页面。你明白我的意思吗?你想把数据发送到服务器吗?如果是,则更新的
navigator.sendBeacon()
在卸载事件中使用可能会引起兴趣…检查浏览器兼容性,但在兼容时,在卸载点时比ajax请求可靠得多…在卸载中使用ajax根本不可靠Windows api无法区分选项卡是否关闭或触发卸载的是什么。你的具体用例是什么?啊,也许我应该更清楚一些。我不关心是什么触发了它,例如,我不关心用户是否真的单击了小关闭按钮,或者他们是否单击了另一个链接,或者他们是否刷新了,等等。我希望在所有这些情况下运行我的代码,只要我的文档将卸载。但是,如果他们在出现的提示中单击cancel,我不想运行代码,因为这样他们显然没有实际卸载页面。你明白我的意思吗?你想把数据发送到服务器吗?如果是这样的话,卸载事件中使用的较新的
navigator.sendBeacon()
可能会很有意思…检查浏览器兼容性,但在兼容时,它在卸载时比ajax请求更可靠…在卸载中使用ajax根本不可靠谢谢!这对我有用。我使用了一个事件监听器用于
beforeunload
,一个用于
unload
,并将要在页面上运行的代码放在
beforeunload
监听器中。现在根本没有提示,这对我来说很好。谢谢!这对我有用。我使用了一个事件监听器用于
beforeunload
,一个用于
unload
,并将要在页面上运行的代码放在
beforeunload
监听器中。现在根本没有提示,这对我来说很好。