Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果用户关闭浏览器而不按“注销”,如何使其处于脱机状态?_Javascript_Jquery_Ajax_Google Chrome_Browser - Fatal编程技术网

Javascript 如果用户关闭浏览器而不按“注销”,如何使其处于脱机状态?

Javascript 如果用户关闭浏览器而不按“注销”,如何使其处于脱机状态?,javascript,jquery,ajax,google-chrome,browser,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

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

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

  $(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
      }
    });


  });

如果您在服务器中使用php,只需使用$\u会话,因为当用户关闭浏览器时,它将被自动销毁。顺便问一下,ar u在哪里定义了这个url
data:url,

我不太确定,但是试着使用
$(window).on
而不是
$(window).bind
。它们应该都能工作,但我一直使用
$(window).on
。另外,您使用
函数(e){
引用了什么?我的第一个未经测试的本能是使用:

$(窗口).on('beforeunload',function(){

我做了一些类似于您在我的实验性消息子系统中尝试完成的事情

首先要注意的一点是,您应该在服务器端强制执行空闲超时。让客户端每隔
N
秒通知服务器它的存在,并将没有ping入
N+L
秒的客户端视为脱机,其中
L
表示一定量的预测延迟(在高端以避免大量延迟)“拍打”)

在客户端,我更幸运地发送了“最后一分钟”"当连接状态更改时通过的请求指示失败/中止,而不是使用
onbeforeunload
。无可否认,这可能是由于我的代码中存在一些非正统的东西。但是,浏览器在完全关闭窗口或选项卡之前自然会关闭连接。此外,它还有一个额外的优点,即当页面以外的内容关闭连接时触发有关系,所以我运气不错

我使用,所以看起来像这样,
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
    }
  }
}
完整的客户端源代码可能有帮助,也可能没有帮助。(它非常庞大。)如果您想查看,可以在消息传递子系统中看到它

如果您正在使用,我不能保证此策略同样有效。但是,我首先尝试绑定到
onclose
onerror
,看看这两种方法是否允许您在最后一分钟触发
XmlHttpRequest