Javascript 停止传播是否会阻止事件在捕获阶段传播?
我在看,这部分内容模棱两可: 在Microsoft模型中,必须将事件的Javascript 停止传播是否会阻止事件在捕获阶段传播?,javascript,dom-events,event-bubbling,event-propagation,Javascript,Dom Events,Event Bubbling,Event Propagation,我在看,这部分内容模棱两可: 在Microsoft模型中,必须将事件的cancelBubble属性设置为true window.event.cancelBubble = true 在W3C模型中,必须调用事件的stopPropagation()方法 e.stopPropagation() 这将停止冒泡阶段事件的所有传播。 所以我的问题是: 当事件侦听器设置为在捕获阶段侦听时,它是否会自动不继续传播到内部元素 或者,如果它继续传播,调用e.stopPropagation()是否会停止它,或者
cancelBubble
属性设置为true
window.event.cancelBubble = true
在W3C模型中,必须调用事件的stopPropagation()
方法
e.stopPropagation()
这将停止冒泡阶段事件的所有传播。
所以我的问题是:
- 当事件侦听器设置为在捕获阶段侦听时,它是否会自动不继续传播到内部元素
- 或者,如果它继续传播,调用
是否会停止它,或者这只适用于气泡阶段e.stopPropagation()
Top of the DOM --->event--->traverses--->to--->[target]+[event]-| (capture phase)
/\ \/
|------------------------to--------back up----------------- (bubble up)
stopPropagation()不会停止调用捕获的事件处理程序。stopPropagation()将停止调用冒泡事件处理程序
var outputDiv=document.getElementById('output');
函数日志(msg){
outputDiv.insertAdjacentHTML('afterend',msg+'
');
}
/////////////////////
//冒泡的听众
/////////////////////
document.getElementById('row1')。addEventListener('click',函数(e){
日志('调用冒泡的行1侦听器');
e、 停止传播();
},假);
document.getElementById('row2')。addEventListener('click',函数(e){
log('调用冒泡的第2行侦听器');
//在这件事上没有停止广播。
},假);
document.getElementById('table')。addEventListener('click',function(){
日志('调用冒泡表侦听器');
},假);
document.addEventListener('click',function(){
日志('调用冒泡文档侦听器');
},假);
/////////////////////
//捕捉听众
/////////////////////
document.addEventListener('click',function(){
日志('捕获调用的文档侦听器');
},对);
document.getElementById('table')。addEventListener('click',function(){
日志('捕获被调用的表侦听器');
},对)代码>
#输出包装器{
边框:1px纯黑;
高度:300px;
溢出:滚动;
}
这一排已经停止了
这一行没有stopPropagation
输出
简短回答:顺序是:
捕获(向下)
目标
冒泡李>
如果在捕获阶段调用e.stopPropagation()
(通过将addEventListener()
的第三个参数设置为true
),它将停止在1,因此2和3无法接收它
如果在冒泡阶段调用e.stopPropagation()
(通过将addEventListener()
的第三个参数设置为false
或只是不分配它),1和2已经完成,因此它只是防止事件从调用stopPropagation()的级别冒泡出来
谢谢。看起来IE8不支持事件捕获,但IE9支持:我的问题是e.stopPropagation()是否只停止冒泡的传播,还是同时停止捕获和冒泡的传播?答案可能与浏览器有关。简短回答:stopPropagation在这两种情况下都会停止事件。如(可怕的)ASCII图所示,事件集从文档
,在DOM中向下,指向触发事件的元素。在那之后,它会返回到文档。在这两者之间的每一步,这个过程都可以停止,不管它是在捕获阶段还是在冒泡阶段。好的,谢谢:)我想我们实际上说了同样的话。。。如果在冒泡时停止,则捕获阶段已完成。。。因此,冒泡时停止不应阻止在捕获阶段侦听的侦听器处理事件。令人难以置信的是,这个答案仍然没有真正回答问题(调用e.stopPropagation()是否停止?),我们需要阅读注释。好多了。你有两个问题。首先,它们是第1行和第2行,而不是列。第二,第2行的事件处理程序实际上不在捕获阶段,因为它的addEventListener
缺少第三个参数。“被接受的答案是正确的。”陈:首先,我同意专栏中用词不当的说法。实际上,我删除了一些列,从而缩短了代码,并留下了这段代码。@Chen我修改了代码,以反映我试图解释的内容。我认为问题更具体。event.stopperPagation()
是否阻止事件通过剩余的event.target
的祖先下降?或者它只是阻止了第2阶段和第3阶段,而第1阶段无论如何都会完成?这是一个比目前被接受的答案好得多的答案。