允许自定义事件处理程序阻止使用延迟的默认操作

时间:2013-10-27 21:15:48

标签: jquery javascript-events jquery-deferred

我想要完成的事情如下:

我有一个打开弹出窗口的链接,但由于该弹出窗口允许编辑数据库记录中的数据,我想在打开弹出窗口之前检查数据库记录是否被锁定。如果数据库记录被锁定,则应向用户显示一条消息而不是弹出窗口。

我的想法是触发自定义事件以允许任何侦听器停止弹出窗口,例如:

$(".popuplauncher").on("click", function(event) {
  event.preventDefault();  // Stop the default click action: opening the popup
  var myCustomEvent = $.Event("myCustomEvent");
  $(this).trigger(myCustomEvent);
  if (myCustomEvent.isDefaultPrevented()) {
    // Show message 'database object locked'
  } else {
    // Everything ok, open the popup
  }
});

但是,由于一个事件监听器有一些异步行为(询问服务器数据库对象是否被锁定),我想我应该在事件监听器中使用延迟对象。

$.when($(this).trigger(myCustomEvent)).then(...)

不起作用,因为trigger()不返回延迟对象,它返回JQuery对象本身以允许链接。

$.when($(this).triggerHandler(myCustomEvent)).then(...)

对我来说不起作用,因为triggerHandler()只返回最后一个事件处理程序的值。因此,如果我有多个事件处理程序,则忽略除最后一个处理程序之外的所有处理程序。

我是在正确的轨道上,还是应该针对这个问题采取不同的方法?如果你问我,我会说这是一个常见的问题。这就是为什么我希望我忽略了一个简单易用的解决方案。

这是我在使用triggerHandler()时玩的fiddle。请注意,只有最后一个处理程序/延迟事项。

0 个答案:

没有答案