使用直接事件侦听器删除项目时,事件将停止冒充到委派事件

时间:2014-09-21 19:35:18

标签: javascript jquery events

尝试使用jquery事件。

似乎如果我在自己的事件处理程序中删除一个项目,它会阻止事件冒泡到委托事件,但直接绑定的事件仍然会触发。

但是,如果我在委托事件中删除它,事件会像我期望的那样传播。

由于我没有返回false或使用stopPropagation(),我认为其他事件仍将触发,无论它们是否直接绑定或委派。

这有意义吗?这是jQuery的错误吗?寻找解释为什么它表现得像这样。

这里是小提琴: http://jsfiddle.net/ahhgu1bb/

当您点击蓝点时,' A UP ...'永远不会出现在控制台中。

单击它的绿点时。

代码:

html:

<div class="main-background">
    <div class="inner-area">
        <div class="blue-point"></div>
        <div class="green-point"></div>
    </div>
</div>

javascript / jquery:

$('.main-background').on('mousedown', '.inner-area', function(e) {
   console.log('A DOWN - deletegated inner-area mouse down'); 
});

$('.main-background').on('mouseup', '.inner-area', function(e) {
   console.log('A UP - deletegated inner-area mouse up'); 
});

$('.main-background').on('mouseup', function(e) {
   console.log('B UP - direct inner-area mouse up'); 
});

$('.blue-point').on('mouseup', function(e) {
   console.log('C UP - direct point mouse up');
   $(this).remove();
});

$('.main-background').on('mouseup', '.green-point', function(e) {
   console.log('D UP - delegated point mouse up');
   $(this).remove();
});

1 个答案:

答案 0 :(得分:1)

来自jQuery文档: http://api.jquery.com/on/

对于委派活动:

  

...当事件直接发生在绑定元素上时,不会调用处理程序,但仅适用于与选择器匹配的后代(内部元素)。 jQuery将事件从事件目标起泡到附加处理程序的元素(即最里面到最外层的元素),并为该路径上与选择器匹配的任何元素运行处理程序。

所以看起来如果我使用事件委托,事件实际上并不直接绑定到附加元素,而是仅从目标元素冒泡触发。

所以在我的情况下,由于在开始冒泡之前移除了目标元素,因此不会发生冒泡(对Amin Jafari赞不绝口!),因此委托事件永远不会触发。但是任何直接绑定的事件处理程序都会被触发。