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