stopPropagation和startPropagation

Pio*_*cik 14 javascript jquery stoppropagation

我想制作一个额外的点击处理程序(客户端页面,不能修改他的js/html),它应该在我的脚本中这样工作:

1)event.stopPropagation(暂停客户点击传播)
2)我的功能(做我的功能,当一切都完成后做下一步)
3)event.startPropagation(继续标准客户端动作)

现在,第一个和第二个工作.第三是问题.
我知道event.startPropagation不存在,但我想要那样的东西.任何提示?

Dav*_*ing 11

您可以在父节点f.ex(jQuery)上重新触发相同的事件对象.您需要先复制事件对象并将其传递给触发器,以便在气泡(f.ex e.pageX)中捕获相同的事件属性:

var copy = $.extend(true, {}, e);
setTimeout(function() {
    $(copy.target.parentNode).trigger(copy);
},500);
e.stopPropagation();
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/GKkth/

编辑

根据您的评论,我认为您正在寻找以下内容:

$.fn.bindFirst = function(type, handler) {
    return this.each(function() {
        var elm = this;
        var evs = $._data(this).events;
        if ( type in evs ) {
            var handlers = evs[type].map(function(ev) {
                return ev.handler;
            });
            $(elm).unbind(type).on(type, function(e) {
                handler.call(elm, e, function() {
                    handlers.forEach(function(fn) {
                        fn.call(elm);
                    });
                });
            });
        }
    });
};
Run Code Online (Sandbox Code Playgroud)

这个原型允许你绑定一个"高级处理程序",它包含一个next函数,可以在你想要的时候执行所有以前的处理程序.使用它像:

$('button').click(function() {
    console.log('first');
}).click(function() {
    console.log('second');
}).bindFirst('click', function(e, next) {
    console.log('do something first');
    setTimeout(next, 1000); // holds the other handlers for 1sec
});
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/BGuU3/1/

  • @PiotrWójcik听起来像是在寻找`stopImmediatePropagation()`,因为处理程序附加到同一个元素:http://api.jquery.com/event.stopImmediatePropagation/.请记住,它不会阻止以前被执行的处理程序.或者您可能只需要找到已经绑定的处理程序,保存它们并稍后在您自己的触发器中执行它们. (2认同)
  • @PiotrWójcik我用可能的解决方案编辑了我的答案,那是你需要的吗? (2认同)

Que*_*tin 2

首先不要停止传播。

测试它是否my function按照您希望的方式执行,然后决定是否要停止传播。

  • 这是一个糟糕的答案,因为当多个事件在同一元素上冒泡时,通常需要停止传播。这是该方法存在的全部原因。 (3认同)