我有一个基于我需要更新用户的注销按钮:离线或在线,但许多用户只是不使用该按钮而只是关闭浏览器。
尝试以下代码但不向服务器提交最后一个请求。怎么做?
$(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
}
});
});
答案 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,我无法承诺此策略同样有效。但是,我首先尝试绑定到onclose
和onerror
,看看其中任何一个是否允许您触发最后一分钟XmlHttpRequest
。
答案 1 :(得分:0)
我对此并不完全确定,但请尝试使用$(window).on
代替$(window).bind
。他们都应该工作,但我总是使用$(window).on
。另外,您使用function(e){
引用了什么?我的第一个未经考验的本能是使用:
$(window).on('beforeunload', function(){
。
答案 2 :(得分:-1)
如果你在服务器中使用php只是使用$ _SESSION,因为它会在用户关闭浏览器时自动销毁。顺便说一下,你定义了这个网址data : url,