onbeforeunload只执行一次

时间:2013-01-25 11:57:25

标签: javascript

我使用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';仅在另一个时刻使用:当用户注销时。不在这里

1 个答案:

答案 0 :(得分:1)

你有race condition。竞争是在异步Ajax请求和浏览器尝试离开页面之间(这是首先导致beforeunload的原因)。导航可能总是会赢,所以浏览器会在Ajax回调完成之前离开页面。

如果你使Ajax请求与async:false同步,那么这种竞争就不会发生,因为JavaScript线程会阻塞直到Ajax请求被解决。请注意,这会导致潜在的恼人用户体验(即,用户尝试关闭页面,但必须等待标签关闭之前解析Ajax请求)。