Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用直接事件侦听器删除项目时,事件停止冒泡到委派事件_Javascript_Jquery_Events - Fatal编程技术网

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

Javascript 使用直接事件侦听器删除项目时,事件停止冒泡到委派事件,javascript,jquery,events,Javascript,Jquery,Events,正在试验jquery事件 看起来,如果我在它自己的事件处理程序中删除一个项,它会阻止事件冒泡到委托事件,但直接绑定的事件仍然会触发 但是,如果我在委托事件中删除它,事件会像我预期的那样传播 由于我没有返回false或使用stopPropagation(),我本以为其他事件仍然会触发,无论它们是否直接绑定或委托 这有意义吗?这是jQuery的一个bug吗?正在寻找它为什么会这样的解释 这是小提琴: 单击蓝点时,控制台中不会出现“A向上…” 当您单击绿点时,它会执行此操作 以及守则: html:

正在试验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();
});