JavaScript,停止其他事件侦听器

Jac*_*ght 5 javascript events

想象一下,我有这个代码:

var myFunc1 = function(event) {
    alert(1);
}
var myFunc2 = function(event) {
    alert(2);
}

element.addEventListener('click', myFunc1);
element.addEventListener('click', myFunc2);
Run Code Online (Sandbox Code Playgroud)

当click事件被触发时,调用myFunc1,然后调用myFunc2.但是,如果满足myFunc1中的某些条件,我如何(如果可能的话)停止调用myFunc2? event.stopPropagation()不是解决方案,因为这不是事件捕获/冒泡问题.

谢谢.

Jac*_*ght 11

DOM Level 3方法event.stopImmediatePropagation正是我在这里所需要的.不幸的是,它目前还没有在任何浏览器中实现(我知道).


out*_*tis 6

还有一个问题:执行事件侦听器的顺序是未定义的.你需要自己处理事件调度以解决这个问题,这导致我们对llimllib的一些建议提出了建议.

function dispatchSleightEvent(evt) {
    var listeners = evt.currentTarget.sleightListeners[evt.type];
    // can't use for-in because enumeration order is implementation dependent
    for (var i=0; i<listeners.length; ++i) {
       if (listeners[i]) {
         if (! listeners[i].call(evt.currentTarget, evt)) {
           return false;
         }
       }
    }
    return true;
}

function mixinSleightTarget(obj) {
  if (! obj.sleightListeners) {
    obj.sleightListeners = {}
    obj.addSleightListener = function(type, listener) {
        if (!this.sleightListeners[type]) {
            this.sleightListeners[type] = [];
            this.addEventListener(type, dispatchSleightEvent);
        }
        if (!this.sleightListeners[type+listener] {
          this.sleightListeners[type+listener] = this.sleightListeners[type].length;
          this.sleightListeners[type].push(listener);
        }
    }
    obj.removeSleightListener = function(type, listener) {
        if (this.sleightListeners[type+listener] {
          delete this.sleightListeners[type][this.sleightListeners[type+listener]];
          delete this.sleightListeners[type+listener];
        }          
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

此代码完全未经测试.要在单个目标上停止事件调度,事件侦听器将返回false.如果你想要更多数据隐藏,你可以从功能编程的角度重写上述内容,尽管这可能会引入内存泄漏.