Javascript 如何检测包含我的PHP应用程序的最后一个选项卡正在关闭?

Javascript 如何检测包含我的PHP应用程序的最后一个选项卡正在关闭?,javascript,dom,Javascript,Dom,我的PHP应用程序的菜单上有一个很好的注销按钮,但有些人不使用它,他们只是退出浏览器 有没有什么方法可以检测到这一点(我知道它不会处理浏览器崩溃,但它比我现在拥有的要好&覆盖了99%的情况) 这将是我的第一篇JS 我想我可以很容易地编写一个页面关闭处理程序?还是应该使用onbeforeunload() 在其中,也许我可以浏览所有浏览器窗口及其选项卡(每个浏览器相同或不同?(例如,FF等)) 我可以获取每个选项卡的URL,并检查它是否正在运行我的应用程序(或者是否有更好的方法来运行) 如果这是最

我的PHP应用程序的菜单上有一个很好的注销按钮,但有些人不使用它,他们只是退出浏览器

有没有什么方法可以检测到这一点(我知道它不会处理浏览器崩溃,但它比我现在拥有的要好&覆盖了99%的情况)

这将是我的第一篇JS

  • 我想我可以很容易地编写一个页面关闭处理程序?还是应该使用onbeforeunload()
  • 在其中,也许我可以浏览所有浏览器窗口及其选项卡(每个浏览器相同或不同?(例如,FF等))
  • 我可以获取每个选项卡的URL,并检查它是否正在运行我的应用程序(或者是否有更好的方法来运行)
  • 如果这是最后一个选项卡,要么加载一个新的时代,这是我的应用程序的注销页面,然后关闭它(等待它完全打开?或者只发送一个HTTP请求,等待200 OK),或者是一些Ajax
更新 请不要使用基于计时器的解决方案。我有一个,但是一个用户将超时时间设置为999999分钟,同时用户数设置为1,然后关闭浏览器并将自己锁定在外

更新 这里知道的人似乎都说JS无法实现,而Google向我建议DOM不支持JS

但是,另一种方式呢?各位,横向思考。当用户打开带有我的应用程序页面的新选项卡时,我可以推送cookie吗?然后在用户希望关闭选项卡时删除cookie?并检查我是否删除了最后一个cookie&通知服务器将其视为注销


如果没有,还有其他方法吗?(在打开和关闭页面上使用Ajax,服务器可以决定最后一个选项卡是否已关闭?

如果在最后的“x”秒/分钟内没有在服务器端发出请求,则只需在服务器端暂停会话即可

通过JS执行此操作可能非常简单,每5秒向服务器发送一次周期性的“心跳”请求,当选项卡关闭时停止。然后,如果您的注销超时是5分钟,那么如果它在5分钟内没有心跳,那么您可以尽可能自信地认为客户端已经离开了

例如,如果您的页面包含大量内容(比如一篇长文章),用户在几分钟/小时内不会发出任何请求,但不关闭选项卡,并且您希望他们保持活动会话,则此功能非常有用

  • 您可以添加一些在
    onbeforeuload
    中关闭页面时执行的代码。不过,如果需要的时间太长,浏览器可能会中止您的代码
  • 不,您不能在选项卡中进行迭代;那将是一个安全漏洞
  • 没有;由于您无法遍历选项卡,因此也无法获取它们的URL
  • 您无法检测它是否是页面打开时的最后一个选项卡,但如果可以,浏览器可能会在关闭选项卡时阻止打开窗口。但是,同步AJAX请求可能会起作用

  • 没有明确的方法来满足您的要求,事实上,在这里之前已经有人问过:


    使用会话超时,就像第一条建议的那样。

    为什么用户在浏览器关闭时注销会很重要?只需使用会话超时。我当然希望JavaScript不能访问我浏览器中其他打开的选项卡。那么那些“删除重复选项卡”插件是如何工作的呢?我是一个完全的JSN00B,但对此很好奇。也许使用本地浏览器存储?当一个选项卡打开时,计数器递增,当它关闭时,计数器递减?这不是问题,因为他们的机器空闲(他们离开了),因此出于安全原因,您需要终止他们的会话。如果其他人回到机器并将其唤醒,您不希望其他人在不重新输入用户密码的情况下访问原始用户的会话。最后,如果一台机器进入睡眠状态,绝对没有办法知道这一点,因为从您的服务器上看,这与关机/重新启动/网络断开/断电没有区别。你得到的唯一迹象是来自客户端的请求——就是这样。没错,我没有想到。正如我所说,我是JS n0b,但你确定你说“你不能遍历选项卡”吗?JU的谷歌“删除重复标签”,你会发现相当多的浏览器pligins。他们是怎么做到的?@Mawg:这些是浏览器扩展。您没有编写浏览器扩展;你正在写一个网页。扩展可以做比网页更多的事情。