2015-06-24 17 views
3

我一直試圖綁定beforeunload事件通過調用以下腳本,以便我可以通過AJAX去指定的URL。問題是AJAX第一次沒有工作,因爲當我第一次執行頁面刷新時URL沒有被調用。阿賈克斯第二次工作。當我將async設置爲false但此時success內的警報彈出窗口不顯示時,此問題得到解決。我需要警戒框也顯示在success區塊。onbeforeunload內部的Ajax第一次不工作

<script type="text/javascript"> 
    $(document).ready(function() { 
    // this method will be invoked when user leaves the page, via F5/refresh, Back button, Window close 
    $(window).bind('beforeunload', function(event){ 
      // invoke the servlet, to logout the user 
     $.ajax({ 
     cache: false, 
     type: "GET", 
     url: "LogoutController" , 
     success: function (data) { 
      alert("You have been logged out"); 
     } 

     }); 
    }); 
}); 
</script> 
+0

哪些瀏覽器您使用? –

+0

只是爲了提醒你,只要用戶在你的網站中瀏覽鏈接,你的方法也會被調用。因此,您的用戶將在他們訪問的每個頁面上註銷(如果AJAX調用有時間完成,可能不會,以及 - 當然 - 如果此代碼存在於每個頁面上)。 **每**頁面解構後觸發'beforeunload';而不僅僅是您在評論中列出的事件。試圖跟蹤離開網站/頁面的用戶是非常困難的,並且容易出現許多問題,因此大多數網站都依賴會話超時進行自動註銷。 – Pebbl

+0

@Vaibs_Cool我需要讓它僅適用於Chrome。 – user2918640

回答

1

beforeunload將等待事件處理程序在關閉頁面之前完成其執行。由於ajax調用是異步的,因此beforeunload不會等待它完成(但您的服務器仍應獲得請求)。這是預期的行爲,我不認爲他們是一種解決方法。

這種行爲可以使用下面的代碼重新:

window.onbeforeunload = function() { 
    console.log("bye"); 
    setTimeout(function() { 
     console.log("bye1"); 
    }, 200); 
    console.log("bye2") 
}; 

//bye 
//bye2 

此外,你應該注意的是,根據MDN規格指出警報()可以忽略不計:

自25 2011年5月,HTML5規範指出,在此事件期間忽略對window.alert(),window.confirm()和window.prompt()方法的調用 可能會被忽略。

當發生這種情況對鉻,你會在控制檯中看到以下消息(僅限於我檢查瀏覽器):

Blocked alert('test') during beforeunload. 
+0

我可以使用異步到假,但在這種情況下,爲什麼警告框內的成功塊沒有彈出?或者我該如何等待控制器通話結束? – user2918640

+0

將async設置爲false將使onbeforeunload等待控制器調用完成,但瀏覽器仍可能會忽略警報。 –