如何在具有多个事件的元素上取消绑定命名空间事件?

时间:2016-09-22 20:19:50

标签: javascript jquery events

我有一个事件监听器,当用户在相应元素外部点击时会触发该事件监听器。

我的问题是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);
            }
        });
    }

三点需要注意:

  1. 处理程序是匿名函数
  2. 这些事件都有一个共同的元素,$(' body');
  3. 通常会有多个处理程序同时处于活动状态,但每个处理程序都有一个唯一的命名空间
  4. 示例:

    用户通过打开模态(click.myModal)来注册事件监听器。然后,用户通过打开模态(click.myDropdown)内的下拉列表来注册第二个事件监听器。

    如果用户在下拉列表外部点击但仍在模态内,则下拉列表将关闭。这是预料之中的。但是,unbind函数还删除了第一个事件侦听器click.myModal。在下拉列表外单击以关闭下拉列表后,单击模态外部将不会关闭模态。这不是预期的。

    感谢您提供的任何见解。

0 个答案:

没有答案