我想要完成的事情如下:
我有一个打开弹出窗口的链接,但由于该弹出窗口允许编辑数据库记录中的数据,我想在打开弹出窗口之前检查数据库记录是否被锁定。如果数据库记录被锁定,则应向用户显示一条消息而不是弹出窗口。
我的想法是触发自定义事件以允许任何侦听器停止弹出窗口,例如:
$(".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。请注意,只有最后一个处理程序/延迟事项。