我正在使用PHP + MySQL + JavaScript创建一个小型聊天应用程序,我编写了一个函数disonnectUser(),当用户按下断开连接按钮时会调用该函数.这里是:
function disconnectUser(){
$.post('web/WEB-INF/classes/handleChatUser.php',{ action: 'disconnect',nick: localNickname});
$('#chat').stop(true,true).fadeOut(2000,function(){
nicknameDialog();
});
$('#messageInput').val(null);
$('#clientList').html(null);
$('#chatScreen').html(null);
clearInterval(refreshIntervalId);
clearInterval(refreshIntervalId2);
connected = false;
}
Run Code Online (Sandbox Code Playgroud)
它就像一个魅力,但当我在另一个上下文中调用这个函数时,当用户而不是按断开连接只是退出页面时,在这个函数中
$(window).unload(function() {
if(connected){
disconnectUser();
connected = false;
}
});
Run Code Online (Sandbox Code Playgroud)
它不起作用.而且我确定它正在被调用,因为如果我发出警报,它会在关闭页面之前正常调用.我认为在代码完全运行之前页面正在关闭,所以我想如果我在那里放一些块直到代码完成运行它会工作吗?
问题是$(window).unload()在关闭窗口之前不等待任何AJAX调用(因为AJAX是assync,这是正确的).
您需要强制AJAX同步,即等待响应.你的disconnectUser功能内部:
$.ajax({
type: 'POST',
async: false, // This is the guy.
url: '/blablabla'
});
Run Code Online (Sandbox Code Playgroud)
你可以在这里阅读更多相关信息:$(window).unload在离开网页之前等待AJAX调用完成