2012-04-22 72 views
11

我正在进行聊天,我试图弄清楚如何检测用户是否已离开页面。几乎所有的事情都由数据库来处理,以避免前端混乱。AJAX和用户离开页面

所以我想要做的是一旦页面因任何原因(窗口关闭,转到另一个页面,单击链接等)留下一个ajax调用将在一个人离开之前被解雇,所以我可以更新数据库。

这是我已经试过:

$(window).unload(function(){ 
     $.post("script.php",{key_leave:"289583002"}); 
}); 

对于一些奇怪的原因,它不会工作,我已经检查了PHP代码,并能正常工作。有什么建议么?

+0

的可能的复制[JavaScript中,浏览器,窗口关闭 - 发送AJAX请求或运行在窗口关闭的脚本(http://stackoverflow.com/questions/6162188/javascript-browsers-window -close-send-an-ajax-request-or-run-a-script-on-win) – 2017-01-12 09:55:17

回答

31

试试这个:

$(window).unload(function(){ 
    $.ajax({ 
     type: 'POST', 
     url: 'script.php', 
     async:false, 
     data: {key_leave:"289583002"} 
    }); 
}); 

注意async:false,这样浏览器等待请求的完成。

使用$.post是异步的,所以在浏览器停止执行脚本之前,请求可能不够快。

+0

令人敬畏的生病让它一去! – Majo0od 2012-04-22 23:03:39

+0

我的天啊!非常感谢,今天学到了一些新东西:-) – Majo0od 2012-04-22 23:05:10

+0

不客气:) – stewe 2012-04-22 23:39:27

1

尝试在$ .post后添加弹出窗口(提示(“离开这么早?”))。它可能工作。这可能是不好的用户体验。 :)

+0

没有工作.... – Majo0od 2012-04-22 22:17:02

+0

我怀疑它会与任何变化一起工作,许多浏览器在浏览器时有不同的策略关闭或只是选项卡正在关闭,甚至页面url被重定向到其他网址。这里最大的问题是,当页面“关闭”时,所有连接和其他内容都被丢弃了!因此,即使您在页面处理之前几毫秒发送POST请求,连接将被终止的可能性也很大。这就是为什么我建议您在$ .post函数调用后使用prompt的原因。我会尝试创建样本,但我不能承诺任何事情。 – 2012-04-22 22:36:38

3

这不是这样做的正确方法......假设操作系统挂起或浏览器过程中发生了什么,然后这个事件不会被解雇。并且您永远不会知道用户何时离开,在他/她断开连接后仍然显示在线状态。相反,你可以做的是。

  1. 尝试连接的插座,这样就可以知道什么时候插座断开
  2. 可以(每1秒后说)向服务器发送一个请求的用户断开连接,这样就可以知道,用户仍然连接。如果您没有收到请求 - 即使在2秒后 - 断开用户连接。
+0

我不知道该怎么做,你有没有例子? – Majo0od 2012-04-22 22:40:18

+0

你用什么服务器端? asp.net? – 2012-04-22 22:41:33

+1

他正在使用PHP。这里有很好的源代码,可以帮助你开始https://github.com/nicokaiser/php-websocket另外它还有SWF对象,用于不支持web sockects的浏览器的套接字实现。 – 2012-04-22 22:44:50

0

这与上面的答案有关。 https://stackoverflow.com/a/10272651/1306144

这将每1秒执行一次ajax调用。 (1000)

function callEveryOneSec() { 
    $jx.ajax({}); // your ajax call 
} 

setInterval(callEveryOneSec, 1000); 
+1

我认为发送AJAX每一秒可以杀死服务器时,将是许多用户... – Siper 2017-03-23 22:07:29