2015-12-03 128 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