2008-11-25 58 views
6

我已經發布了這個here,但認爲它可能值得自己的問題。ASP.NET linkbutton提高onBeforeUnload事件兩次

我想要做的是顯示一個對話框,詢問用戶如果他/她想離開頁面,如果有未保存的更改。這一切都很好。但是,問題描述如下:

有沒有人遇到過Internet Explorer將兩次觸發onb​​eforeunload事件的問題?在Google上搜索時,我發現它與(其中包含)ASP.NET鏈接按鈕的事實有關,HTML代碼是<a href="javascript: __doPostBack...

顯然,當IE遇到沒有href="#"的鏈接時,它會觸發onb​​eforeunload事件。然後,當您確認我們正在顯示的javascript對話框時,頁面將執行「真實」卸載以導航到其他頁面,並再次提升onbeforeunload事件。

互聯網上提供的解決方案是設置一個布爾變量並在顯示對話框之前檢查它。所以第二次,它不會被顯示。這很好,但是當用戶取消時,變量仍然會被設置。因此,下次用戶想要離開該頁面時,對話框將不再顯示。

希望這有點清楚,我希望有人找到解決辦法嗎?

回答

10

對annakata的反應:是的,但是您希望瀏覽器使用對話框的結果。所以你可能會認爲使用'return bFlag'會做伎倆(或event.returnValue = bFlag),但是這會給你第二個對話框。 我找到了解決辦法,感謝this page。這是很簡單的實際上是:

var onBeforeUnloadFired = false; 

使用這個全局變量在這裏:

if (!onBeforeUnloadFired) { 
    onBeforeUnloadFired = true; 
    event.returnValue = "You'll lose changes!"; 
} 
window.setTimeout("ResetOnBeforeUnloadFired()", 1000); 

,然後實現該功能:

function ResetOnBeforeUnloadFired() { 
    onBeforeUnloadFired = false; 
} 

所以,實際上,使用該標誌,但重置如果用戶點擊取消。不完全是我想要的,但沒有找到更好的東西。

+0

我認爲你正在從字面上理解我的答案。我的意思是你想在顯示對話框之前將確認值存儲在你用來檢查的標誌中。我想你會以任何方式:) – annakata 2009-02-13 10:13:12

1

我還沒有遇到過這個問題,但是您肯定可以設置標誌變量等於對話框的結果嗎?如果用戶取消該標誌,則將保持爲假。

var bFlag = window.confirm('Do you want to leave this page?'); 
0

IE支持名爲onstop的文檔對象上的事件。此事件在onbeforeunload事件之後但在onunload事件之前觸發。這與你的兩個對話框問題並不完全相關,但它與其他人可能在這個線程上絆倒有關(就像我一樣)。

我遇到的問題是我需要在onbeforeunload事件觸發時顯示加載消息。這一切都很好,直到頁面上有確認對話框。即使用戶取消並保持在頁面上,onbeforeunload事件也會觸發。最簡單的做法是將我的「加載」顯示邏輯移動到document.onstop的處理程序中。最重要的是,您必須檢查文檔對象的readyState屬性,這是另一個僅限IE的字段。如果它的「加載」,這意味着用戶實際上離開了頁面。如果它的「完整」,則表示用戶正在停留。

如果您使用IE瀏覽器很好,那麼您可能會對以下內容感興趣。

document.onstop = function() 
{ 
    try 
    { 
     if(document.readyState != "complete") 
     { 
      showLoadingDiv(); 
     } 
    } 
    catch(error) 
    { 
     handleError(error); 
    } 
}