JavaScript stopping additional event listeners

Imagine I have this code:

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

element.addEventListener('click', myFunc1);
element.addEventListener('click', myFunc2);

When the click event is fired, myFunc1 is called myFunc2. But how can I (if at all possible) stop myFunc2 from being called if some condition in myFunc1 is satisfied? event.stopPropagation()It is not a solution, since it is not a problem of capturing / bubbling events.

Thanks.

+3
source share
5 answers

There is another problem: the execution order of event listeners is undefined. You will need to process the dispatch of events yourself to get around this, which leads us to some variant of the llimllib clause.

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];
        }          
    }
  }
}

. , false. , , .

+5

DOM Level 3 event.stopImmediatePropagation - , . , ( ).

+5

, :

var myFunc1 = function(event) {
    alert(1);
    if (something) {
        event.cancel = true;
    }
}
var myFunc2 = function(event) {
    if (event.cancel) {
        return;
    }
    alert(2);
}

document.body.addEventListener('click', myFunc1, false);
document.body.addEventListener('click', myFunc2, false);

/ .

+3

, , . , , , .

. :

var myFunc1 = function(event) {
    alert(1);
}
var myFunc2 = function(event) {
    alert(2);
}
var clickHandler = function(event) {
    if (f1active) myFunc1(event);
    if (f2active) myFunc2(event);
}

element.addEventListener('click', clickHandler);
var f1active = true;
var f2active = true;

, , , clickHandler.

+2

-, outis, , DOM .

, , actionscript 2007 .

http://positionabsolute.net/blog/2007/06/event-dispatcher.php

Of course, I'm not really a javascripter, so give me a head if this is not relevant.

0
source

Source: https://habr.com/ru/post/1712399/


All Articles