2010-02-10 61 views
1

我有以下jquery函數,當他們有未保存的更改(類似於SO如何)並嘗試離開當前屏幕時提示用戶。爲什麼OnBeforeUnload用asp:LinkBut​​ton兩次觸發?

<!-- in my aspx page --> 
<script type="text/javascript" language="javascript"> 
    window.onbeforeunload = function() 
    { 
     if (HasPendingUpdates()) 
     { 
      return "Changes you have made will not be saved."; 
     } 
    } 
</script> 

可正常工作,並顯示消息框,當用戶試圖點擊A HREF瀏覽掉或使用返回按鈕等我遇到的問題是,我的環節之一是asp:LinkButton因爲它在離開頁面之前需要關閉一些服務器端代碼。當用戶點擊這個LinkButton時,他們會得到兩次提示。

方案:

  1. 用戶點擊LinkButton
  2. 提示出現和用戶點擊取消按鈕。
  3. 提示消失,用戶仍在屏幕上。好。

  4. 用戶點擊LinkButton

  5. 提示出現,並點擊OK按鈕。
  6. 提示消失,並再次顯示相同的提示。
  7. 用戶再次單擊確定。
  8. 提示消失,用戶移動到下一個屏幕,一切都很好。

那麼,爲什麼我會得到第二個提示? OnBeforeUnload如何發射兩次?

回答

0

使用jQuery添加處理程序將它們堆疊起來。如果你爲你的hrefs分配一個帶有jQuery函數的處理程序,然後再爲你的linkbutton分配它,那麼將會有兩個處理程序。

檢查您綁定onunload處理程序的頻率,並確保您要麼解除綁定以前的處理程序,要麼只做一次。

+0

我不分配公頃特別是對任何控制。 Jquery函數在頁面加載時執行,並將該函數分配給window.onbeforeunload。該頁面永遠不會被加載多次,所以Jquery代碼只能綁定一次。所有其他鏈接,後退按鈕等不會導致雙重提示。 – Kelsey 2010-02-10 19:08:35

0

這裏是如何解決這一問題:

var checkChangesEnabled = true; 
    window.onbeforeunload = confirmExit; 

    function confirmExit() { 
     if (checkChangesEnabled) { 
      event.returnValue = "Changes you have made will not be saved."; 
      disableCheck(); 
     } 
    } 

    function disableCheck() { 
     checkChangesEnabled = false; 
     setTimeout("enableCheck()", "100"); 
    } 

    function enableCheck() { 
     checkChangesEnabled = true; 
    } 
2

我也有類似的問題,但是,我並不想火onbeforeunload對了LinkBut​​ton可言,因此我用在每一個LinkBut​​ton的下面。 aspx頁面:

的了LinkBut​​ton的
OnClientClick="eval(this.href);return false" 

功能並未被削弱,因爲他們所做的是提供與CommandArgument命令的代碼隱藏處理...

相關問題