【问题标题】:How to detect if browser is closed using jQuery如何使用jQuery检测浏览器是否关闭
【发布时间】:2010-11-04 13:07:23
【问题描述】:

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

【问题讨论】:

    标签: jquery browser navigation


    【解决方案1】:

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

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

    【讨论】:

    • 我将查询哪些数据来进行定期轮询?如果他们关闭了浏览器,则没有数据进入,所以我可以对一些不活动变量进行轮询,但是,如果他们刚刚离开椅子一会儿并打算回来,我不想让他们退出。
    • 只需使用 setInterval:setInterval(function(){$.ajax({...}), 60 * 1000);。每分钟执行一次 AJAX 请求,如果用户的浏览器未发送请求,则假定他们已注销。您无需依赖用户的任何活动。
    • 但是如果用户浏览器关闭,它就不能也不会运行任何jQuery或Javascript函数,如setInterval。
    • 没错。没有 AJAX 调用将告诉您的服务器用户已关闭窗口。请注意,如果您已经在定期轮询更新,您可以使用这些调用来允许服务器检测用户是否仍然存在。顺便说一下,这就是 StackOverflow 的聊天系统以及许多其他系统的工作方式。
    • 除非您建议我以某种方式在服务器上运行另一个函数,该函数请求使用聊天功能的每个用户的状态。这可能会变得非常高。
    【解决方案2】:

    无论您使用什么进行聊天(轨道式、websockets?)都应该能够检测到会话超时。

    【讨论】:

    • 我都没有使用。因为我对这个概念不熟悉,所以我可能以不是最好的方法来执行这个功能。当 Tom 在文本框中输入内容并按 Enter 键发送给 Jim 时,ajax 函数会调用我程序中的一个过程以将(发送者 ID、消息、接收者 ID、发送时间)提交到表中。然后,我使用带有 ajax 请求的设置间隔循环(5 秒)来查询该表中以 Jim 的 ID 作为接收者 ID 的任何内容,并在 Tom 和 Jim 之间的聊天框中显示结果。有点令人费解,但它仍然有效(无法访问 APE)。
    • 你说得对,这不是最好的方法,但在这种情况下,只需要在某个时间收到请求,因为它是正常的,并在会话没有发生时强制会话过期。
    • 不,你不明白,请求是从用户发送来查询服务器上的一个表的。服务器不向浏览器请求任何内容。老实说,我不知道如何让它从特定的用户浏览器窗口请求任何东西。
    • 哦,我明白了,您可能希望在服务器上运行一个单独的进程,该进程检查您表上会话的 lastupdate 时间,然后设置一些标志或删除会话(如果会话超过某个时间)。当其他用户请求信息时,他们应该会看到该用户已注销。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-14
      • 2013-01-06
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 2015-04-09
      相关资源
      最近更新 更多