【问题标题】:how to break event.stopImmediatePropagation如何打破 event.stopImmediatePropagation
【发布时间】:2014-06-10 07:11:48
【问题描述】:

我有这样的代码。

<td>
 <span class='ui-button-next'>NEXT</span>
</td>

此应用程序包含一个库,并且不允许对其进行编辑。单击“ui-button-next”时,他们正在调用event.stopImmediatePropagation() 来停止某些事情。

我想在用户点击这个“span”而不接触那个库时调用一个函数。

我的自定义代码如

$(".ui-button-next").click(function(){
});

$(".ui-button-next").bind("click",function(){
});

$(".ui-button-next").on("click",function(){
});

由于库上的event.stopImmediatePropagation() 而无法正常工作。 任何解决方法?

非常感谢!

【问题讨论】:

    标签: javascript jquery jquery-ui javascript-events


    【解决方案1】:

    您可以访问底层事件列表(数组)并首先插入新的点击处理程序,它将正常触发,但请注意执行顺序在您的情况下应该不是问题:

    //this is the inner handler
    $('.ui-button-next').click(function(e){
       e.stopImmediatePropagation();     
    });
    //this is the handler of your own
    $('.ui-button-next').click(function(e){       
        alert('OK');
    });
    
    //get click handlers list
    var clicks = $._data($('.ui-button-next')[0], 'events')['click'];
    //get the last added handler (which is your own handler) and put it at the beginning
    clicks.unshift(clicks.pop());
    

    Demo.

    UPDATE:为了保持执行顺序(默认处理程序首先执行,所有额外添加的处理程序在之后执行),我认为您必须通过删除所有@来修改默认处理程序987654324@ 方法,我们这里必须使用eval() 方法。请注意,在这种情况下使用该方法是完全可以的。

    //get click handlers list
    var clicks = $._data($('.ui-button-next')[0], 'events')['click'];
    //remove the e.stopImmediatePropagation() in each handler
    $.each(clicks, function(i,e){
      var handlerText = e.handler.toString()
                         .replace(/e.stopImmediatePropagation\(\)/g,'');    
      eval("e.handler = " + handlerText);
    });
    

    Updated demo.

    【讨论】:

    • 感谢您的帮助。实际上执行顺序很重要。我想最后执行这段代码。因为在此之前,需要填充很多字段。
    • @user3724926 查看我更新的演示。它完全破坏了e.stopImmediatePropagation(),以后添加的所有附加处理程序都会正常触发。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 2010-09-23
    • 2017-11-23
    相关资源
    最近更新 更多