2010-06-17 95 views
5

好的,我有一個問題,下面的代碼。當用戶關閉瀏覽器時會發生什麼,它會提示他們單擊確定或單擊取消離開該頁面。點擊確定會觸發一個window.location重定向到用戶跟蹤的另一個頁面(是的,爲了避免火焰戰爭,有一個輔助系統來保證準確的跟蹤,在用戶從任務管理器中剔除瀏覽器的情況下(如同樣的問題所述))。取消將保留在頁面上,問題是無論按下哪個按鈕,都會重定向,就好像您想離開頁面一樣。相關代碼如下。Javascript onbeforeunload問題

window.onbeforeunload = confirmExit; 
function confirmExit() 
{ 
    var where_to = confirm("Click OK to exit, Click CANCEL to stay."); 
    if (where_to == true) 
    { 
     window.location="logout.php"; 
    } 
    if (where_to == false){ 
     alert("Returning..."); 
    } 
} 

回答

6

onbeforeunload不能這樣工作。關聯的函數應返回一個字符串,該字符串依次顯示在默認的onbeforeunload對話框中。

function confirmExit() { 
    return "This message will appear in the dialog."; 
} 

但你不返回任何東西,並用confirm()採取它在你自己的手中。當函數沒有返回任何東西時,那麼onbeforeunload對話框將根本不顯示。

要調用真正的註銷,您希望使用onunload事件。這裏有一個重寫:

window.onbeforeunload = confirmExit; 
window.onunload = logout; 

function confirmExit() { 
    return "Click OK to exit, Click CANCEL to stay."; 
} 

function logout() { 
    window.location = 'logout.php'; 
} 

你然而依賴於web瀏覽器的最後遺囑實際上是否擊中了服務器。大部分(如果不是全部)網頁瀏覽器都不會。我寧願在該網址上發佈一個垃圾請求,但是您依賴於webbrowser以及它是否能夠完美地工作。

+0

Ajax請求不起作用。我的意思是,他們確實有效,但有時他們沒有足夠的時間在頁面實際卸載之前完成。我們已經在我們的開發機器上嘗試了這種技術,確保請求完成的唯一方法是使其同步。這對IE造成了很大的問題,因爲它對每個瀏覽器實例的Ajax請求堆棧有限。 – 2010-06-17 13:02:45

+0

@Igor:公平點。我又做了一次本地測試,它可以在IE8和Chrome上運行,但不能在FF3和Safari4上運行。 – BalusC 2010-06-17 13:15:09

+0

@ IgorZinov'yev你可以實現這個沒有問題,如果ajax調用是一個火災,並忘記。電話會一直打到服務器。 – thomaux 2013-04-26 08:05:22

0

也許不是劫持用戶的瀏覽器,你可以從你的unbeforeunload內觸發一個XHR請求(),並得到你需要派人過來在你需要它的數據?

沒有更多的用例很難說,但這可能提供一個很好的選擇。

0

在IE9和Chrome

測試
function addEvent(elm, evType, fn, useCapture) { 
    if (elm.addEventListener) { 
    elm.addEventListener(evType, fn, useCapture); 
    return true; 
    } 
    else if (elm.attachEvent) { 
    var r = elm.attachEvent('on' + evType, fn); 
    return r; 
    } 
    else { 
    elm['on' + evType] = fn; 
    } 
} 

function exitAlert(e) { 
    var msg = "This message will appear in the dialog."; 
    if (!e) { e = window.event; } 
    if (e) { e.returnValue = msg; } 
    return msg; 
} 

addEvent(window, 'beforeunload', exitAlert, false);