2015-12-03 71 views
2

我有下面這段代碼將'傳播'一個事件給我所有的js模塊。這是爲了在試圖離開當前頁面時被觸發。問題是,當表單提交時(提交/取消/保存),我不會觸發它。有沒有辦法檢查?重寫jQuery自定義事件

main.js:

...

$(document).ready(function(){ 

    $(window).on('beforeunload', function(){ 
      var e = $.Event('webapp:page:closing'); 

      $(window).trigger(e); 

      if (e.isDefaultPrevented()){ 
       return e.message || 'You have unsaved stuff!'; 
      } 
     }); 
} 

...

+1

我喜歡那個小包裝的事件處理程序。我可能不得不使用類似的東西。現在我使用一個隊列系統,其優點是處理程序不必檢查事件是否已被其他事件阻止。 (如上所述,如果您有多個處理程序阻止默認設置並且設置'message',則最後一個獲勝;我的第一個處理程序會([和其他人不會被調用]),但不確定有多重要。 ) –

+0

我喜歡你的方法。關於隊列應該如何工作的一般指示?謝謝 – Sebastian

+0

只是一個處理程序的列表(我不應該真的稱它爲隊列),它由真正的'beforeunload'處理程序按順序調用。 –

回答

2

之前提交/保存/取消,您可以撥打下面的代碼,將所有聽衆刪除處理

$(window).off('webapp:page:closing'); 
+1

'.off()'http://api.jquery.com/off? – guest271314

+0

它沒有工作。保持傳播事件 – Sebastian

+0

我的錯誤,我曾經註釋過一條導致這不起作用的線。它現在奏效,謝謝! – Sebastian

1

,想到的唯一辦法是:與形式,當它處理webapp:page:closing頁面事件,它應該而不是如果它已經提交了一個表單(它可以通過頁面中的一個變量進行跟蹤),就可以阻止它的默認設置。

+0

我試過這種方法,但沒有奏效。我創建了一個名爲form_submitted = false的全局變量;並在$(窗口).on('beforeunload')...我檢查如果form_submitted是假的觸發自定義事件之前。但是,在到達提交事件之前,這是首先被擊中,所以我的布爾變量總是虛假的 – Sebastian

+0

我的錯誤,我已經註釋掉了一個導致這不起作用的線。它現在奏效,謝謝! – Sebastian

2

在表單提交解除綁定事件:


$("#frm").submit(function(e) { 
    $(window).off('beforeunload'); 
}); 

從MDN:本。 off()方法刪除附加的.on()

+0

試過但沒有工作。事實上,它沒有觸及提交事件 – Sebastian

+0

我的錯誤,我已經註釋掉了一個導致這不起作用的線。它現在奏效,謝謝! – Sebastian