我使用onbeforeunload来重置带有Ajax请求的变量。但它只执行一次。例如,如果我访问页面(登录后)并关闭窗口,则执行该功能,但如果我重复操作(将登录地址放入浏览器并关闭窗口),则不执行该功能。 / p>
window.onbeforeunload = function (e) {
//Ajax request to reset variable in database
resetDemoValueWithAjax();
};
//Ajax request to reset variable in database and exit
function resetDemoValueWithAjax(){
$.ajax({
async:true,
type: "POST",
dataType: "json",
url:"http://localhost/site/index.php/welcome/resetDemoValue",
data: {name: "demo"},
success:function(){
document.location.href='http://localhost/site/index.php/auth/logout';
},
error: function(){
document.location.href='http://localhost/site/index.php/auth/logout';
}
});
}
document.location.href='http://localhost/site/index.php/auth/logout';
仅在另一个时刻使用:当用户注销时。不在这里
答案 0 :(得分:1)
你有race condition。竞争是在异步Ajax请求和浏览器尝试离开页面之间(这是首先导致beforeunload
的原因)。导航可能总是会赢,所以浏览器会在Ajax回调完成之前离开页面。
如果你使Ajax请求与async:false
同步,那么这种竞争就不会发生,因为JavaScript线程会阻塞直到Ajax请求被解决。请注意,这会导致潜在的恼人用户体验(即,用户尝试关闭页面,但必须等待标签关闭之前解析Ajax请求)。