为什么事件会在dom上冒出来?

时间:2016-10-05 19:36:20

标签: javascript dom event-bubbling

我理解事件冒泡以及它如何从最内层元素遍历dom。我很好奇为什么这是默认行为?

<div>1
    <div>2
        <div>3
            <div>4
                <div>5</div>
            </div>
        </div>
    </div>
</div>

如果我在每个部分都有一个事件监听器,但是单击<div>5</div>为什么事件会冒泡到div4,div3,div2(等)的事件监听器?

编辑:我不认为这是“什么是事件冒泡”的副本,因为这是在询问为什么不是什么

2 个答案:

答案 0 :(得分:2)

如果你问为什么这是默认行为,那么答案是因为the language specification says so(强调我的):

  

事件监听器由以下字段组成:

     
      
  • [...]
  •   
  • 捕获(布尔值,最初为假
  •   
  • [...]
  •   
  

当一个事件被调度到参与树的对象(例如一个元素)时,它也可以到达该对象的祖先上的事件监听器。首先,以树的顺序调用其捕获变量设置为true的所有对象的祖先事件侦听器。其次,调用对象自己的事件侦听器。最后,仅当事件的bubbles属性值为true时,才会再次调用object的祖先事件侦听器,但现在以反向树顺序调用。

如果你问为什么规范是这样定义的,你可以问自己:
如果你点击了div5,你是否也点击过div4? 这最终是一个意见问题,但对我来说答案是肯定的,根据我最初的评论:

  

如果你去过日内瓦,你也去过瑞士。

答案 1 :(得分:1)

你的陈述是错误的。 The default for simple events is not to bubble

  

触发名为 e 的简单事件意味着trusted事件   名称​​ e 不会冒泡(除非另有说明)   声明)并且不可取消(除非另有说明),和   必须创建使用Event接口的   dispatched在给定目标。

所以HTML相关的事件会让它冒出来,因为规范明确地这么说,大概是因为这样做更有意义。

一些冒泡的事件:

一些不起泡的事件:

相关问题