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