Javascript 使用直接事件侦听器删除项目时,事件停止冒泡到委派事件
正在试验jquery事件 看起来,如果我在它自己的事件处理程序中删除一个项,它会阻止事件冒泡到委托事件,但直接绑定的事件仍然会触发 但是,如果我在委托事件中删除它,事件会像我预期的那样传播 由于我没有返回false或使用stopPropagation(),我本以为其他事件仍然会触发,无论它们是否直接绑定或委托 这有意义吗?这是jQuery的一个bug吗?正在寻找它为什么会这样的解释 这是小提琴: 单击蓝点时,控制台中不会出现“A向上…” 当您单击绿点时,它会执行此操作 以及守则: html:Javascript 使用直接事件侦听器删除项目时,事件停止冒泡到委派事件,javascript,jquery,events,Javascript,Jquery,Events,正在试验jquery事件 看起来,如果我在它自己的事件处理程序中删除一个项,它会阻止事件冒泡到委托事件,但直接绑定的事件仍然会触发 但是,如果我在委托事件中删除它,事件会像我预期的那样传播 由于我没有返回false或使用stopPropagation(),我本以为其他事件仍然会触发,无论它们是否直接绑定或委托 这有意义吗?这是jQuery的一个bug吗?正在寻找它为什么会这样的解释 这是小提琴: 单击蓝点时,控制台中不会出现“A向上…” 当您单击绿点时,它会执行此操作 以及守则: html:
<div class="main-background">
<div class="inner-area">
<div class="blue-point"></div>
<div class="green-point"></div>
</div>
</div>
从jQuery文档中: 对于委派事件: 。。。当事件直接发生在绑定元素上时,不会调用该处理程序,而仅针对与选择器匹配的子体(内部元素)。jQuery将事件从事件目标冒泡到附加处理程序的元素(即,从最内层到最外层的元素),并为与选择器匹配的路径上的任何元素运行处理程序 因此,如果我使用事件委派,那么事件实际上并不直接绑定到附加的元素,而只是从目标元素冒泡触发的
因此,在我的例子中,由于目标元素在冒泡开始之前就被移除了,所以冒泡不会发生(阿明·贾法里对此表示敬意!),因此委派的事件永远不会触发。但是,任何直接绑定的事件处理程序都会被触发。我单击了
。蓝点
,看到日志C向上…
和。绿点
,问题似乎无法重现!你看到“A”了吗?当你点击两个点时?当我点击蓝点时,我从来没有看到这一点。哦,我看到,A UP…
将永远不会被解雇,因为您直接为.bluepoint
分配了一个函数。如果您检查事件的目标,它将是蓝点
,因此内部区域
不是目标,并且不会触发事件。请记住,如果将事件分配给子元素,则单击子元素时不会触发父元素的委派事件!这很有道理!如果不是这样,那将是一片混乱!但是如果我在.blue point
事件处理程序中删除$(this).remove()
,则会显示一个UP。这使我认为删除它会产生某种干扰。是的,但如果您看到日志的顺序,它是C UP…
,然后是A UP…
,因此除非。内部区域的事件目标(即。蓝点
)在冒泡时间出现(触发。蓝点
事件之后),.internal area
事件没有目标,因此它不会被触发。
$('.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();
});