Events 如何在jQuery中撤消event.stopPropagation?

Events 如何在jQuery中撤消event.stopPropagation?,events,javascript-events,jquery,Events,Javascript Events,Jquery,我正在应用程序中使用event.stopPropagation()。然而,出现了一个场景,我希望传播继续,就好像前面提到的函数从未被调用一样。所以我想知道是否有一种方法可以在停止传播后“恢复”传播?将对event.stopPropagation的一个调用移动到十几个单独的条件语句中会非常繁琐。将event.stopPropagation()调用放在您的条件中。比如说 $el.click(function(event) { if (some_condition) { eve

我正在应用程序中使用
event.stopPropagation()
。然而,出现了一个场景,我希望传播继续,就好像前面提到的函数从未被调用一样。所以我想知道是否有一种方法可以在停止传播后“恢复”传播?将对
event.stopPropagation
的一个调用移动到十几个单独的条件语句中会非常繁琐。

event.stopPropagation()
调用放在您的条件中。比如说

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

这可能很乏味,但不幸的是停止播放是一种单向切换。一旦停止,您就无法为同一事件重新打开它。

一旦停止传播,就无法恢复。 作为一种解决方法,您可以设置一个变量,然后仅在该变量为真时停止:

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

只需像这样重构原始事件:

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

以下是一个有效的解决方案:

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

    e.stopImmediatePropagation();

alert('this will happen only once');

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

});

它利用了事件可以具有自定义名称空间的事实,并可以相应地解除绑定。它也适用于
e.stopPropagation
。就这一点而言,它可以撤消与自定义单击事件相关的任何操作。

Mmmm…如果有这样的功能,您不需要一打条件语句来决定是否调用它吗?它们已经存在了。将有一个调用
event.stopPropagation()
,并且(很少)有一个调用假设的
event.resumePropagation()
。这比在除一个以外的所有条件中调用
event.stopPropagation()
更可取,因为它不是“a”条件。有很多条件。引用我自己的话:“将一个对event.stopPropagation的调用移动到十几个单独的条件语句将是非常乏味的”这可能是乏味的,但不幸的是,
stopPropagation
是一个单向开关。一旦停止,你就不能在同一事件中重新打开它。这就是我一直在寻找的答案。因为这实际上回答了我的问题,如果你认为我没有想到的话,我会接受的。这比我的备份解决方案更干净。如果您可以编辑您的答案并包含“传播一旦停止,就无法恢复”这一事实,那么这将是最佳选择。您可以提供一个使用e.stopPropagation()停止事件,然后使用上面的示例重新启动事件的工作示例吗?我无法让它工作,但理论上看起来是对的。