如果用户在不注销注销的情况下关闭浏览器,如何进行离线状态?

时间:2014-08-28 20:56:37

标签: javascript jquery ajax google-chrome browser

我有一个基于我需要更新用户的注销按钮:离线或在线,但许多用户只是不使用该按钮而只是关闭浏览器。

尝试以下代码但不向服务器提交最后一个请求。怎么做?

  $(window).bind('beforeunload', function(e) {  
    //if (id>=2) {
    //  return "WARNING: Your status is call connected. If you refresh now, software will lose all the connection status.";
    //} else {
    //  return "WARNING: Your status is not connected. You can refresh.";
    //}

    $.ajax({
      type    : "GET",//POST
      dataType: 'json',
      url     : '/php/makeunavailable',
      data    : url,
      async   : true,
      beforeSend: function() {
      },
      complete: function() {
      },
      success : function(msg) {
        // do nothing but make offline
      }
    });


  });

3 个答案:

答案 0 :(得分:2)

我在实验性消息传递子系统中尝试完成类似的

前面需要注意的一点是,您应该在服务器端强制执行空闲超时。让客户端每隔N秒向服务器通知其存在,并将N + L秒内未被释放的客户视为离线,其中L表示某些金额预测的潜伏期(在高端以避免大量的"拍打")。

在客户端,我有更好的运气发送和#34;最后一刻"请求通过连接状态更改指示失败/中止而不是onbeforeunload。不可否认,这可能是由于我的代码中存在一些非正统性​​。但是,浏览器在完全关闭窗口或标签之前自然会终止连接。并且,除了页面关闭之外的其他内容中止连接时,它还具有触发的附加优势。所以,我已经好运了。

我使用XmlHttpRequests,所以它看起来像这样,其中r是我的请求对象:

r.onreadystatechange = function() {
  if (r.readyState == 4) {
    if (r.status == 200) {
      // success logic
    } else if (r.status == 0 || r.responseText == '') {
      // assume the client aborted the connection
      issueLogoutRequest();
    } else {
      // failure logic
    }
  }
}

完整的客户端来源可能有用,也可能没用。 (它非常庞大。)如果您想要在消息传递子系统中thepointless.com,可以看到它。

如果您正在使用WebSocket's,我无法承诺此策略同样有效。但是,我首先尝试绑定到oncloseonerror,看看其中任何一个是否允许您触发最后一分钟XmlHttpRequest

答案 1 :(得分:0)

我对此并不完全确定,但请尝试使用$(window).on代替$(window).bind。他们都应该工作,但我总是使用$(window).on。另外,您使用function(e){引用了什么?我的第一个未经考验的本能是使用:

$(window).on('beforeunload', function(){

答案 2 :(得分:-1)

如果你在服务器中使用php只是使用$ _SESSION,因为它会在用户关闭浏览器时自动销毁。顺便说一下,你定义了这个网址data : url,