我想创建一个自定义事件来测试任何已注册的处理程序是否返回false,并在任何人执行时取消操作。
我有两种类型的对象,(一个或多个)页面和(一个)导航器。
Navigator注册用户尝试离开页面,但它不知道页面上的内容。 Page对象知道页面的内容,但不知道用户何时尝试离开页面。
我希望导航器发出一个所有Page对象都可以监听的beforepageleave事件,如果所有Pages中的beforepageleave处理程序返回true,Navigator应继续其业务,但如果任何Page处理程序返回false,它应该只取消导航并留在页面上。
Page有一个hasChanges属性,如果为true,则应该停止Navigator。
因此,Page中的处理程序可以采用简化形式:
navigator.on('beforepageleave', function (e) { return !this.hasChanges; });
导航器方法可以简化为:
leavePageLinks.click(function (e) {
let proceed = true;
$.each(registeredEventHandlers, function (index, handler) {
if (!handler(e)) {
proceed = false;
}
}
return proceed;
});
我已经看到jQuery在(jQuery._data || jQuery.data)(elem,'events')中保存了事件处理程序,但是我更愿意使用非私有方法而不依赖于可能在我不知情的情况下完全改变的代码。另外,我不确定我是否应该像这样覆盖这样的处理?