Javascript 在导航离开页面/页面关闭时从用户哈希中删除某人

Javascript 在导航离开页面/页面关闭时从用户哈希中删除某人,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我正在构建一个Node.js/Socket.io项目 我有一个基于websocket id的用户哈希。当用户发出以下请求时,我希望将他们添加到查看该页面的一组用户中 app.get('/board/:id', function(req, res){} 我想保留像这样的东西 浏览={ 用户名:id, 用户名:id, ... } 但是我不确定如何删除用户,比如说,如果他们离开页面。是否存在在页面离开时调用的某种函数? 部分解决方案:以下内容似乎可以解决Chrome问题: $(window).

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

我有一个基于websocket id的用户哈希。当用户发出以下请求时,我希望将他们添加到查看该页面的一组用户中

app.get('/board/:id', function(req, res){}
我想保留像这样的东西

浏览={ 用户名:id, 用户名:id, ... }

但是我不确定如何删除用户,比如说,如果他们离开页面。是否存在在页面离开时调用的某种函数?

部分解决方案:以下内容似乎可以解决Chrome问题:

   $(window).unload(function(){
      var username = $('#username').text();
      var pid = currentProject;

      var data = {
        username: username,
        id : pid
      }

      socket.emit('leaving-page', data);
    })
。。。是否有某种函数在页面上被调用 离开

是的,但它不可靠

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

  • 添加用户上次刷新/访问页面的时间
  • 限制你认为它们脱机
。。。是否有某种函数在页面上被调用 离开

是的,但它不可靠

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

  • 添加用户上次刷新/访问页面的时间
  • 限制你认为它们脱机
您可以截获与离开页面相对应的事件。有几种方法可以做到这一点,请查看以下链接,并让我知道是否有适合您的需要的链接,以及我是否可以回答有关这些链接的任何更明确的问题:

使用最后一个链接,您可以执行以下操作:

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

希望这有帮助。

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

使用最后一个链接,您可以执行以下操作:

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

希望这有帮助。

由于您使用的是Socket.io,服务器将知道用户何时离开页面,因为Socket将断开连接。只需聆听
断开连接
事件

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
命名空间的所有客户端。

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

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
命名空间的所有客户端。

我认为没有任何100%可靠的方法可以做到这一点。例如,当客户端计算机突然断电时会发生什么。我认为没有100%种可靠的方式来实现这一点。例如,当客户端计算机突然断电时会发生什么,但您仍然可以使用“页面离开”功能,使其更准确。但是,如果“页面离开”功能失败,您应该使用一些东西进行备份。谢谢,我将尝试将您的答案与@Daniele Bs answer:)结合使用,但您仍然可以自由使用“页面离开”功能,以提高时间准确性。但是,如果“页面离开”功能失败,您应该用一些东西进行备份。谢谢,我将尝试您的答案和@Daniele Bs answer:)的组合。)