什么是事件?事件流?
事件指的是浏览器中发生的一些特定的交互瞬间,可以通过监听器来监听事件的发生,然后执行相应的代码。事件流指的是页面接收事件的顺序。我们下文要讲的事件冒泡、捕获、委托就属于事件流。
DOM事件流的三个阶段
- 事件捕获阶段
- 处于目标阶段
- 事件冒泡阶段
事件捕获:事件从根节点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:如何阻止默认行为?
- 获取DOM后绑定的事件,可以在事件处理函数中返回false来取消。
- 通过addEventListener这种形式绑定的,可以在事件处理函数中通过e.preventDefault()来取消。
RQ4:DOM0和DOM2有什么区别?
- 语法上的区别:
DOM0使用的是onclick来进行监听,DOM2使用的是addEventListener来监听。
- 是否有事件流:
DOM0没有事件流,事件一旦发生则立即处理,DOM2则包含事件流(捕获、目标、 冒泡)。