JS事件冒泡、事件捕获、事件委托到底有什么区别?

298 阅读3分钟

什么是事件?事件流?

事件指的是浏览器中发生的一些特定的交互瞬间,可以通过监听器来监听事件的发生,然后执行相应的代码。事件流指的是页面接收事件的顺序。我们下文要讲的事件冒泡、捕获、委托就属于事件流。

DOM事件流的三个阶段

  1. 事件捕获阶段
  2. 处于目标阶段
  3. 事件冒泡阶段

事件捕获:事件从根节点documnet到目标节点。 事件目标:事件流到达目标元素之后,执行目标元素相对应的处理函数。 事件冒泡:从目标节点到document对象的顺序触发,也就是会将事件传递给其父级。

addEventListener的第三个参数有什么用?

第三个参数如果是true,表示采用事件捕获,如果是false表示的是事件冒泡,这个参数如果不指定则默认是false,也就是说默认是事件冒泡。

e.target和this的区别

  • this指的是绑定事件的对象。
  • e.target返回的是点击的对象,也就是触发事件的对象。

如何阻止事件冒泡?

事件监听器在监听到事件被触发的时候可以通过event.stopPropagation来阻止冒泡行为。

什么是事件委托?

事件委托指的是不给每个子节点单独设置事件监听器,而是设置在其父节点上,然后利用冒泡原理设置到每个子节点上。

例如:我们可以给ul绑定事件,一旦li被点击,事件冒泡会触发ul绑定的事件,此时该事件就会被触发。

为什么要有事件委托?

为了提高页面的性能,我们希望的是尽可能少的操作DOM,绑定的事件处理程序越多越影响性能,事件委托帮助我们只操作一次DOM,提高了程序的性能和效率。

问题汇总

RQ1:事件委托是如何获取到点击对象的呢?

答:通过e.target获取。

RQ2:如何让捕获在冒泡后执行?

根据W3C标准,应该先捕获再冒泡,如果想要实现先冒泡再捕获,可以给一个元素绑定两个addEventListener,其中一个第三个参数设置为false,另一个第三个参数设置为true,然后让false的在前,true的在后即可实现先冒泡后捕获。

RQ3:如何阻止默认行为?

  1. 获取DOM后绑定的事件,可以在事件处理函数中返回false来取消。
  2. 通过addEventListener这种形式绑定的,可以在事件处理函数中通过e.preventDefault()来取消。

RQ4:DOM0和DOM2有什么区别?

  1. 语法上的区别:

DOM0使用的是onclick来进行监听,DOM2使用的是addEventListener来监听。

  1. 是否有事件流:

DOM0没有事件流,事件一旦发生则立即处理,DOM2则包含事件流(捕获、目标、 冒泡)。