如何使用jQuery检测浏览器是否关闭

4
我需要使用jQuery检测浏览器是否正在关闭,并在此情况下执行事件。我在我的网站上有一个聊天功能(类似于Facebook),它会在用户在网站结构中导航到其他页面时保持其登录状态,但如果他们单击浏览器的关闭按钮,则需要将其从聊天中注销(以便他们不会向其他人显示在线)。因此,.unload()将无法正常工作,因为.unload()将应用于所有窗口操作,包括在网站结构内导航到另一个页面。 .unload()适用于浏览器关闭,但也适用于浏览器前进和后退导航,因此我需要一种方法来检测浏览器是否正在关闭,并且仅当浏览器正在关闭时才执行相应的操作。
3个回答

2

最好的方法是设置定期轮询服务器以告知其用户仍在该页面上。您可以每分钟发送一个AJAX请求以确认用户是否仍在该页面上,如果自上次通知以来已经过去了超过一分钟的时间,则在服务器端注销它们。

这可能不是最可靠的解决方案,但它是非常常见的,并且可能对您想要做的事情很有效。


我需要查询哪些数据以进行这种定期轮询?如果他们关闭了浏览器,那么就没有数据传入,因此我可以在某些非活动变量上轮询,但是,如果他们只是离开椅子一会儿并打算回来,我不想让他们退出登录。 - sadmicrowave
只需使用 setInterval:setInterval(function(){$.ajax({...}), 60 * 1000);}。每分钟执行一次 AJAX 请求,如果用户的浏览器没有发送请求,则假定他们已经注销。您不需要依赖用户的任何活动。 - lonesomeday
但是,如果用户关闭了浏览器,则无法运行任何jQuery或Javascript函数,例如setInterval。 - sadmicrowave
没错。AJAX调用的缺失将告诉您的服务器用户已经关闭了窗口。请注意,如果您已经在定期轮询更新,您可以使用这些调用来让服务器检测用户是否仍然存在。顺便说一下,这就是StackOverflow聊天系统以及许多其他系统的工作方式。 - lonesomeday
除非你在暗示我在服务器上运行另一个函数,该函数请求每个使用聊天功能的用户的状态。这可能会变得非常高。 - sadmicrowave
@ sadmicrowave 不,我的建议是每次轮询服务器时,更新“last_polled”(或其他)数据库字段,并每分钟(或其他)运行cron job,注销超过一分钟未被看到的所有人。如果使用nice,这应该是相当不显眼的。 - lonesomeday

1

这是不可能的。onunload / onbeforeunload 是系统提供的唯一事件。页面卸载的原因不会透露给页面。

可以经常检查脚本打开的窗口是否仍然存在。这些解决方案基于setInterval()和窗口的closed属性。但我认为这不是你要找的。


1
无论您使用的是什么聊天工具(Orbited、WebSockets等),都应该能够检测到会话超时。

我都没有用。因为我对这个概念很陌生,所以我可能没有用最好的方法来执行此功能。当 Tom 在文本框中键入一些内容并按回车键发送给 Jim 时,一个 ajax 函数调用我的程序中的一个过程将(发送者 ID、消息、接收者 ID、发送时间)提交到表格中。然后,我使用一个带有 ajax 请求的 setinterval 循环(每5秒钟),查询该表格中的任何具有 Jim 的 ID 作为接收者 ID 并将结果显示在 Tom 和 Jim 之间的聊天框中。有些复杂,但仍然可以工作(没有访问 APE)。 - sadmicrowave
你说得对,那不是最好的方法,但在这种情况下,只需在特定时间内期望请求,并在未发生时强制使会话过期。 - Bjorn
不,你没有理解,请求是从用户发送的,用于查询服务器上的表。服务器不会向浏览器请求任何内容。说实话,我不知道如何让它从特定的用户浏览器窗口请求任何内容。 - sadmicrowave
哦,我明白了,你可能想要在服务器上运行一个单独的进程,检查表中会话的最后更新时间,然后设置一些标志或删除会话,如果它已经过期。当其他用户请求信息时,他们应该看到该用户已注销。 - Bjorn

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