0

我使用 onbeforeunload 来重置带有 Ajax 请求的变量。但它只执行一次。例如,如果我访问页面(登录后)并关闭窗口,则执行该功能,但如果我重复该操作(在完成登录后将地址放入浏览器并关闭窗口),则不会执行该功能。

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

4

1 回答 1

1

你有一个竞争条件。竞争是在异步 Ajax 请求和浏览器试图离开页面(这是beforeunload首先引起的)之间的竞争。导航离开可能总是会获胜,因此浏览器会在 Ajax 回调完成之前离开页面。

如果您使 Ajax 请求与 同步async:false,则不会发生这种竞争,因为 JavaScript 线程会阻塞,直到 Ajax 请求解决。请注意,这会导致潜在的烦人用户体验(即,用户尝试关闭页面但必须等待 Ajax 请求解决,然后选项卡才会关闭)。

于 2013-01-25T14:02:26.587 回答