Как отменить event.stopPropagation в jQuery?

Я использую event.stopPropagation() в своем приложении. Однако появился один сценарий, в котором я хочу, чтобы распространение продолжалось так, как если бы вышеупомянутая функция никогда не вызывалась. Поэтому мне интересно; есть ли способ "возобновить" распространение после его остановки.? Было бы очень утомительно перенести один вызов на event.stopPropagation на дюжину отдельных условных операторов.

Ответ 1

Как только распространение остановлено, оно не может быть возобновлено. В качестве обходного пути вы можете установить переменную, а затем остановится только в том случае, если эта переменная истинна: ​​

var stop = false;
// do your logic here
if(stop){
    event.stopPropagation();
}

Ответ 2

Поместите вызов event.stopPropagation() в ваше состояние. Например

$el.click(function(event) {
    if (some_condition) {
        event.stopPropagation()
        // do stuff
    }
    else {
        // do other stuff, without stopping propagation
    }
});

Зачастую это может быть, но, к сожалению, stopPropagation - это односторонний переключатель. После остановки вы не можете включить его для одного и того же события.

Ответ 3

Просто настройте свое оригинальное событие следующим образом:

var refEvent = event.originalEvent;
refEvent.cancelBubble = false;
refEvent.defaultPrevented = false;
refEvent.returnValue = true;
refEvent.timeStamp = (new Date()).getTime();

if (event.target.dispatchEvent){
    event.target.dispatchEvent(refEvent);
} else if (event.target.fireEvent) {
    event.target.fireEvent(refEvent);
}

Ответ 4

Вот решение, которое работает:

$('#mydiv').on('click.new', function(e){

    e.stopImmediatePropagation();

alert('this will happen only once');

$('#mydiv').unbind('click.new');

});

Он использует тот факт, что событие может иметь собственное пространство имен и может отпереть соответствующим образом. Он также работает для e.stopPropagation. В этом случае он может отменить все, что связано с этим пользовательским событием клика.