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

Jquery 允许自定义事件处理程序阻止延迟的默认操作,jquery,javascript-events,jquery-deferred,Jquery,Javascript Events,Jquery Deferred,我想做的事情如下: 我有一个打开弹出窗口的链接,但是因为该弹出窗口允许编辑数据库记录中的数据,所以我想在打开弹出窗口之前检查数据库记录是否被锁定。如果数据库记录被锁定,则应向用户显示一条消息,而不是弹出窗口 我的想法是触发一个自定义事件,允许任何侦听器阻止弹出窗口打开,如: $(".popuplauncher").on("click", function(event) { event.preventDefault(); // Stop the default click action: o

我想做的事情如下:

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

我的想法是触发一个自定义事件,允许任何侦听器阻止弹出窗口打开,如:

$(".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()时做的一个例子。请注意,只有最后一个处理程序/延迟处理程序才重要。

简单地调用ajax,然后根据返回数据的状态,在成功处理程序中打开包含适当内容的弹出窗口,这似乎是一个很长的路要走。如果这太简单了…需要更好地解释更高级别的问题实际上,上面发布的代码来自一个小部件,它唯一的任务是控制弹出窗口。用于检查数据库锁的代码(并且应该)位于完全不同的模块中(关注点分离)。主要问题是允许多个异步处理程序取消默认操作。我可以预见将来会出现多个事件处理程序的其他类似情况,这些事件处理程序完全独立于弹出代码,这就是为什么我需要一个通用的解决方案,而不是一个脏补丁。