0

我想制作一个页面,显示所有正在查看该页面的用户。理想情况下,数据库将存储页面上的用户,并且当用户进入和离开时,websockets 将用于更新。

问题是我不知道如何判断用户何时查看该页面。我在想我能够知道他们何时到达以及何时退出并相应地添加/删除。他们什么时候到达很容易判断;然而,很难判断他们什么时候离开——尤其是因为用户可能会做一些事情,比如打开多个标签,关闭一个但保持另一个打开。

做这个的最好方式是什么?我使用 PHP 作为我的服务器端语言。

4

5 回答 5

2

您可以使用窗口上的blurfocus事件来切换变量。然而, IE 有一些你需要解决的怪癖。

作为不工作focus事件的后备,您可以mousemove向文档添加处理程序。这也可能会限制自动超时,该超时仅通过在特定时间段内没有用户交互的事实来检测焦点丢失。但是,您将永远无法检测到一个分心的用户,该用户打开了站点,但正在查看其他内容……

要检测窗口关闭,您可以挂钩unload事件。这可能不可靠,但是当您使用 Websockets 时,您的服务器可以轻松检测到关闭的连接。

于 2012-08-03T00:29:28.313 回答
1

好吧,你可以做的一件事,特别是如果你使用 websockets,如果你真的想要的话,每隔几秒就对服务器进行一次心跳/ping。如果你没有得到那个心跳,你知道他们不再在页面上......但是,得到响应并不意味着他们正在查看页面,它只是意味着它是打开的,可能在另一个页面上标签。如果此人失去对页面的关注并打开另一个选项卡/窗口,我不知道它会向服务器发送响应。

于 2012-08-02T23:47:58.823 回答
1

正如蒂姆所提到的,Firefox 和 IE 将在后台选项卡中运行 javascript,因此无法通过简单的轮询来判断用户是否真的在“查看”页面,或者只是在某个地方打开了它。尽管我不知道用户是否真的在查看您的页面,但一个潜在的解决方案可能是将轮询绑定到操作。所以你可能有一些变量

var timesincelastaction=0;
var threshhold = 20;

然后

setInterval("timesincelastaction++",100);

然后

function keepAlive() {
  if(timesincelastaction > threshhold) {
    $.ajax(...tell the server you are alive...);
    timesincelastaction = 0;
  }
}

然后开始考虑像这样的行动

$('a').mouseover(keepAlive);
$('div').mouseover(keepAlive);
$(window).scroll(keepAlive);
$(video).play(keepAlive); // okay this isn't a real one but you get the picture

因此,您只需对用户可能在页面上执行的所有需要​​他们注意的事情进行头脑风暴,并将其用作您的基准。

我知道这似乎有点激烈,可能有一些很好的方法来优化它。只是大声思考。好奇地想看看其他人的想法。

于 2012-08-03T00:13:00.207 回答
0

每次您的一个 PHP 脚本运行时,某些用户或实体都会请求查看您网站上的页面(这通常会在每次您的脚本运行时发生)。

检测用户何时离开您的页面更具挑战性,这就是为什么大多数在线指标只是超时,即如果您在过去 5 分钟内没有在网站上活动,则不再被视为在线。

您可以使用 $_SERVER['REMOTE_ADDR'] 之类的变量获取有关请求页面的用户的信息,或者如果您已经拥有身份验证系统,您应该能够提取用户用户名,将此信息与用户名/ip 一起存储在数据库中作为具有时间戳的唯一键,如果它们的时间戳超过 5 分钟,则根本不将它们视为在线。

于 2012-08-02T23:43:44.340 回答
0

您可能可以使用jQuery-ajax和. 该请求将在告诉您他们正在查看时触发,并在告诉您他们不再查看时触发。剩下的就留给你自己去弄清楚,因为听起来你已经掌握了它。unloadloadajaxloadunload

笔记。在普通 JS 中应该可以实现相同的结果。比如,onunload。谷歌会帮你找到剩下的。

于 2012-08-02T23:50:08.173 回答