0

onbeforeunloadを使用して、Ajaxリクエストで変数をリセットします。ただし、実行されるのは1回だけです。たとえば、(ログイン後に)ページにアクセスしてウィンドウを閉じると、関数は実行されますが、操作を繰り返すと(ログインが完了した状態でブラウザにアドレスを入力してウィンドウを閉じる)、関数は実行されません。

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 に答える