【问题标题】:Detect multiple tabs or windows of the same session in a web application在 Web 应用程序中检测同一会话的多个选项卡或窗口
【发布时间】:2017-02-28 16:20:26
【问题描述】:

我是 JavaScript 和 php 的新手,所以我有一个问题,是否有办法在浏览器的网站中检测同一会话的多个选项卡或窗口。 在我正在制作的网站上,当用户登录时,布尔(0-1)变量存储在数据库中的用户表中,显示该用户是否已登录。在有人登录并关闭选项卡或浏览器窗口后,数据库再次更新它更改显示用户是否登录的变量。我这样做的方式是调用下面的脚本

$(window).bind("beforeunload",function(){
 $.ajax({ 
    url: "logout.php", 
    async: false
    });
})

如果用户关闭窗口或选项卡,logout.php 会更新数据库。我的问题是,如果有人在同一个网站的同一个会话中打开了多个选项卡,并且只关闭其中一个,则会话将保留,而数据库将更新用户不再登录。

已编辑:我不想注销所有打开的选项卡,我只是不想在用户关闭会话的所有选项卡窗口或点击注销按钮之前保持用户仍然在线的数据库。

【问题讨论】:

  • 我认为你的想法很糟糕,例如,如果用户关闭他的笔记本电脑或冻结浏览器,卸载将不会运行。我认为最好的办法是更新数据库中的用户“lastclick”时间戳。
  • @esemve 如果用户空闲并且不做任何事情会话正在关闭并且数据库正在更新。这是一个不同的案例,我已经处理好了。

标签: javascript php jquery


【解决方案1】:

这是来自之前的堆栈溢出帖子:

if (+Cookies.get('tabs') > 0)
    alert('Already open!');
else
    Cookies.set('tabs', 0);

Cookies.set('tabs', +Cookies.get('tabs') + 1);

window.onunload = function () {
    Cookies.set('tabs', +Cookies.get('tabs') - 1);
};

网址: How to know if browser tab is already open using Javascript?

这应该对你有用!

*这不是我的代码,只是传递信息!

【讨论】:

  • 这假设 window.onunload 被调用,但可以想象它可能不会;例如如果用户的计算机崩溃。此外,根据实施情况,可能存在竞争条件,例如用户打开两个选项卡。现代选项卡间通信:blog.arnellebalane.com/… 或服务器端代码的心跳可能需要强大的解决方案。
  • 请注意,如果您已经在对非数字值进行算术运算(例如加或减 1),则不需要一元 + 运算符。
  • 在这种情况下,本地存储比 cookie 更好。
猜你喜欢
  • 2015-06-11
  • 2012-07-31
  • 1970-01-01
  • 2022-11-09
  • 2011-06-25
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多