Javascript 停止传播是否会阻止事件在捕获阶段传播?

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()是否会停止它,或者

我在看,这部分内容模棱两可:

在Microsoft模型中,必须将事件的
cancelBubble
属性设置为
true

window.event.cancelBubble = true
在W3C模型中,必须调用事件的
stopPropagation()
方法

e.stopPropagation()
这将停止冒泡阶段事件的所有传播。

所以我的问题是:

  • 当事件侦听器设置为在捕获阶段侦听时,它是否会自动不继续传播到内部元素
  • 或者,如果它继续传播,调用
    e.stopPropagation()
    是否会停止它,或者这只适用于气泡阶段

不,事件侦听器不会阻止任何事件传播,除非您明确告诉它。你所指的那部分是关于泡沫阶段的。IE的模型不支持事件捕获-句号。捕获阶段是冒泡阶段之前的阶段:

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阶段无论如何都会完成?这是一个比目前被接受的答案好得多的答案。