如何在jQuery中撤消event.stopPropagation?

时间:2012-02-17 08:18:15

标签: events javascript-events jquery

我在我的应用程序中使用event.stopPropagation()。然而,已经出现了一种情况,我希望传播继续,好像上面的函数从未被调用过一样。所以我想知道; 有没有办法在它停止后“恢复”传播?将一次调用event.stopPropagation移到十几个单独的条件语句中会非常繁琐。

4 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:2)

event.stopPropagation()电话置于您的情况之内。例如

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

可能是乏味的,但不幸的是,停止传播是一种单向转换。停止后,您无法为同一事件重新打开它。

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

这是一个有效的解决方案:

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

    e.stopImmediatePropagation();

alert('this will happen only once');

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

});

它利用了事件可以具有自定义命名空间的事实,并且可以相应地取消绑定。它也适用于e.stopPropagation。就此而言,它可以撤消与该自定义点击事件相关的任何内容。