在离开页面/页面closures时从用户散列中删除某人

我正在构build一个Node.js / Socket.io项目。

我有基于他们的websocket id的用户散列。 当用户提出以下请求时,我想将其添加到查看该页面的一组用户。

app.get('/board/:id', function(req, res){} 

我想保留一些类似的东西

Browsing = {username:id,username:id,…}

不过, 我不确定如何删除用户可以说,如果他们离开页面。 是否有某种function在页面离开时被调用?

部分解决scheme:

以下似乎在Chrome上做的伎俩:

  $(window).unload(function(){ var username = $('#username').text(); var pid = currentProject; var data = { username: username, id : pid } socket.emit('leaving-page', data); }) 

有没有什么function,被称为页面离开? …

是的,但不可靠。

人们跟踪谁在线,谁不在线的方式通常是这样的:

  • 添加用户上次刷新/访问页面的时间
  • 设置一个限制,你认为他们离线

你可以拦截与离开页面相对应的事件。 有几种方法可以做到这一点,看看下面的链接,让我知道是否有任何适合您的需求,如果我可以回答任何更明确的问题:

  • 拦截页面退出事件
  • 检测用户何时离开网页的最佳方法?
  • jquery卸载

与最后一个链接,你可以做这样的事情:

  $(window).unload(function() { //remove the user from your json object with delete json_object[key]; }); 

希望这可以帮助。

由于您使用的是Socket.io,服务器会知道用户何时离开页面,因为套接字将被断开。 只要听取disconnect事件。

 io.sockets.on('connection', function (socket) { ... socket.on('disconnect', function () { // The user on `socket` has closed the page }); }); 

更好的做法是利用命名空间并让Socket.io处理所有的连接/断开操作(无论如何,无需重复工作)。

在客户端上,

 socket = io.connect('http://example.com/pagename'); 

pagename不需要在你的域上指向一个有效的URL – 这只是你将在服务器代码中使用的命名空间:

 io.sockets.clients('pagename') 

获取当前连接到pagename名称空间的所有客户端。