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

时间:2011-10-16 02:12:39

标签: javascript dom

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

有什么方法可以检测到这一点(我意识到它不会处理浏览器崩溃,但它比我现在更好并且覆盖了99%的情况)。

这将是我的第一部JS。

  • 我认为我可以轻松编写一个页面关闭处理程序?或者我应该使用onbeforeunload()?
  • 在其中,也许我可以浏览所有浏览器窗口及其标签(每个浏览器相同或不同?(IE,FF等))
  • 我可以获取每个标签的网址,并检查它是否正在运行我的应用程序(或者是否有更好的方法)?
  • 如果这是最后一个标签,要么加载一个新的年龄,这是我的应用程序的注销页面,然后关闭它(等待它完全打开?或者只是发送一个HTTP请求并等待200 OK),或者可能是一些Ajax ?

我希望有人可以对可怜的JS n00b表示同情,并指出我正确的方向。

由于


更新:请不要使用基于计时器的解决方案。我有一个,但是一个用户将超时设置为999999个ninutes,同时用户数设置为1,然后关闭他的浏览器&把自己锁在外面


更新:似乎那些知道的人说它不能在JS中完成,谷歌建议我在DOM中不支持。

但是,另一种方式呢?伙计们,横向思考。当用户使用我的应用中的页面打开新标签时,我可以推送Cookie吗?然后在用户希望关闭标签时删除cookie?并检查我是否正在重新启动最后一个cookie&通知服务器将其视为注销?

如果不是cookie还有其他一些方法吗? (在打开和关闭的页面上使用Ajax,服务器可以决定最后一个标签是否已关闭?)

3 个答案:

答案 0 :(得分:3)

如果在最后'x'秒/分钟内没有在它下面发出请求,则只需在服务器端超时。

通过JS执行此操作可能非常简单,只需每隔5秒向服务器发送一次定期“心跳”请求,该选项会在关闭选项卡时停止。然后,如果您的注销超时是5分钟,那么如果它没有获得5分钟的心跳,您可以尽可能地确信客户端已经消失。

例如,如果您的网页内容很多(比如很长的文章),用户不会在几分钟/小时内发出任何请求,但是没有关闭标签,那么这很有用这样,你希望他们保持活跃的会话。

答案 1 :(得分:1)

  1. 您可以添加一些在onbeforeunload中关闭页面时执行的代码。但是,浏览器可能会中止您的代码,如果花费的时间太长。
  2. 不,你不能迭代标签;这将是一个安全漏洞。
  3. 否;由于您无法遍历标签,因此无法获取其网址。
  4. 您无法检测它是否是打开页面的最后一个标签,但如果可以,浏览器可能会阻止在关闭标签页时打开一个窗口。但是,同步AJAX请求可能有效。

答案 2 :(得分:1)

没有明确的方法来做你所要求的事情,事实上这在此之前已被问过:

javascript detect browser close tab/close browser

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