我有一个事件监听器,当用户在相应元素外部点击时会触发该事件监听器。
我的问题是unbind函数清除了此事件的所有实例 - 而不仅仅是命名空间事件。
当有多个事件绑定到同一个元素时,如何取消绑定命名空间事件?
_ myModal _ _ _ _ _
| |
| dropdown |
| |
| |
|_ _ _ _ _ _ _ _ _ _|
registerOutsideClickHandler('.myModal', closeModal);
registerOutsideClickHandler('.myDropdown', closeDropdown);
function registerOutsideClickHandler (container, callback) {
let eventNamespace = 'click' + container;
return $('body').on(eventNamespace, function(evt) {
if ( !$(evt.target).parents(container).length ) {
callback(evt);
//TODO this is broken - unbinds ALL the click events on $('body')
$('body').off(eventNamespace);
}
});
}
三点需要注意:
示例:
用户通过打开模态(click.myModal
)来注册事件监听器。然后,用户通过打开模态(click.myDropdown
)内的下拉列表来注册第二个事件监听器。
如果用户在下拉列表外部点击但仍在模态内,则下拉列表将关闭。这是预料之中的。但是,unbind函数还删除了第一个事件侦听器click.myModal
。在下拉列表外单击以关闭下拉列表后,单击模态外部将不会关闭模态。这不是预期的。
感谢您提供的任何见解。