我想创建一个页面,显示正在查看该页面的所有用户。理想情况下,数据库会存储页面上的用户,并在用户进入和离开时使用websockets进行更新。
问题是我不知道如何判断用户何时查看该页面。我以为我能告诉他们什么时候到达以及何时退出并相应地添加/删除。它们到达时很容易辨别;然而,很难分辨它们何时离开 - 特别是因为用户可能会做一些事情,比如打开多个标签,关闭一个但保持另一个标签打开。
最好的方法是什么?我使用PHP作为我的服务器端语言。
答案 0 :(得分:2)
您可以使用窗口上的blur
and focus
events来切换变量。但是,您需要解决IE does some quirks。
作为不工作focus
事件的后备,您可以在文档中添加mousemove
处理程序。这也可能会限制自动超时,仅通过在特定时间段内没有用户交互的事实来检测焦点的丢失。但是,您永远无法检测到网站已打开但会查看其他内容的分心用户...
要检测窗口关闭,您可以挂钩unload
event。这是might be unreliable,但是当您使用Websockets时,您的服务器可以轻松检测到已关闭的连接。
答案 1 :(得分:1)
嗯,你可以做的一件事,特别是如果你正在使用websockets,如果你真的想要的话,每隔几秒就会对服务器做一次心跳/ ping操作。如果你没有得到那个心跳,你知道他们不再在页面上了......但是,得到回复并不意味着他们正在看页面,这只是意味着它是开放的,可能在另一个标签中。如果此人失去对页面的关注并打开另一个选项卡/窗口,我就无法向服务器发送响应。
答案 2 :(得分: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
那么你就可以集体讨论用户可能在需要他们注意的页面上做的所有事情并将其作为你的基准。
这似乎有点激烈我知道,可能有一些很好的方法来优化它。只是大声思考。很想知道其他人想出了什么。
答案 3 :(得分:0)
每次运行一个PHP脚本时,某些用户或实体都会请求查看您网站上的页面(这通常在您的脚本运行时发生)。
检测用户何时离开您的网页更具挑战性,这就是为什么大多数在线指标只是超时,即如果您在过去5分钟内未在网站上活动,则不再考虑在线
您可以获取有关使用$ _SERVER ['REMOTE_ADDR'等变量请求页面的用户的信息,或者如果您已经拥有一个身份验证系统,您应该能够提取用户的用户名,将此信息存储在数据库中username / ip作为带时间戳的唯一键,如果时间戳超过5分钟,则不计算在线。
答案 4 :(得分:0)