2008-09-11 65 views
3

我有一個頁面,做了很多工作,我不希望用戶能夠離開該頁面(關閉瀏覽器,回擊按鈕等),而不會收到警告。我發現onbeforeunload事件(我認爲是特定於IE的,這對我來說工作正常,因爲項目使用了很多ActiveX)非常好。我可以爲特定元素重寫onbeforeunload嗎?

問題是,我希望用戶能夠點擊右上角的一個小「幫助」圖標並隨時彈出一個幫助窗口。這會導致onbeforeunload被觸發,即使主窗口永遠不會去任何地方,頁面也不會卸載。

onbeforeunload事件運行時運行的JavaScript函數只是將文本放入event.returnValue中。如果我可以確定,幫助圖標是被點擊的圖標,那麼我可以不在這種情況下將文本放入event.returnValue中。但我怎麼能有頁面的數字呢?

回答

8

讓我猜:幫助「圖標」實際上是一個鏈接與javascript:網址?將其更改爲一個真正的按鈕,一個真正的鏈接,或者至少將功能置於onclick事件處理程序中(這可以防止默認行爲)。問題解決了。

<!-- clicking this link will do nothing. No onbeforeunload handler triggered. 
Nothing. 
And you could put something in before the return false bit... 
...and the onunload handler would still not get called... --> 
<a href="http://www.google.com/" onclick="return false;">blah1</a> 
<!-- this should also do nothing, but IE will trigger the onbeforeunload 
handler --> 
<a href="javascript:void(0)">blah2</a> 
+0

其實這是一個真正的聯繫 - 我錯誤的印象是onclick在onbeforeunload後被解僱。謝謝。 – 2008-09-12 14:19:47

2

編輯:我的「解決方法」下面是完全矯枉過正,基於我的缺乏理解。用Shog9的答案在上面。

好的,當我寫這個問題時,我想出了一個解決方法,現在可以工作。

我把一個全局JavaScript變量作爲一個布爾值來判斷圖標是否被懸停。然後,我將事件附加到圖像的onmouseover和onmouseout事件,並編寫將設置此值的函數。最後,我只是在處理onbeforeunload的函數中編寫代碼,它會在設置event.returnValue之前檢查此值。

可能不是一個完美的解決方法,但它現在可以工作。

-1

我有一個方法有點笨重,但它在大多數情況下都可以工作。

創建一個包含FRAMESET的「Holding」彈出頁面,其中包含一個100%單個FRAME,並將常規onUnload和onbeforeUnload事件處理程序放置在HEAD中。

<html> 
<head> 
<script language="Javascript" type="text/javascript"> 
    window.onbeforeunload = exitCheck; 
    window.onunload = onCloseDoSomething; 

    function onCloseDoSomething() 
    { 
    alert("This is executed at unload"); 
    } 

    function exitCheck(evt) 
    { 
    return "Any string here."} 
    </script> 
    </head> 

    <frameset rows="100%"> 
    <FRAME name="main" src="http://www.yourDomain.com/yourActualPage.aspx"> 
    </frameset> 
<body> 
</body> 
</html> 

使用這種方法,你可以自由地使用你想看到的,回來後,點擊超鏈接沒有外框onunload的或onbeforeunload事件被解僱的實際頁面。

如果外框被刷新或實際關閉,則事件將觸發。

就像我所說的,不是全面的證據,但會在每次點擊或回傳時繞過事件的發射。

+0

框架很醜 – ThiefMaster 2010-11-09 13:22:37

0

在互聯網上,你會發現很多人都建議你使用類似

window.onbeforeunload = NULL

但這並不在IE6爲我工作。閱讀MSDN文檔中的事件對象,我發現了對event.cancelBubble屬性的引用,我認爲這是對該解決方案的引用。但是多虧了Orso指出設置「事件」。cancelBubble = true「是無用的,擺脫確認提示的方法是完全排除return語句,我選擇使用布爾變量作爲標誌來決定是否返回某些內容。 JavaScript的programattically在後面的代碼代碼:

Page.ClientScript.RegisterStartupScript(typeof(String), "ConfirmClose", @" <script>  window.onbeforeunload = confirmExit;  function confirmExit()  {   if(postback == false)    return ""Please don't leave this page without clicking the 'Save Changes' or 'Discard Changes' buttons."";              }  </script>"); 

然後幫助按鈕包含以下的ASPX標記:

OnClientClick="postback=true;return true; 

這個設置「回發」變量爲true,這被在confirmExit回升( )功能,具有取消事件的效果。

希望你覺得這個有用。它經過測試並在IE6和FF 1.5.0.2中運行。

相關問題