事件冒泡和捕获 | 青训营笔记

121 阅读2分钟

这是我参与[第四届青训营]笔记创作活动的第2天。

一.为什么会有事件冒泡和事件捕获

因为同一像素点会被不同dom包含,而这些dom还往往是父子嵌套关系,那么点击这个点,是点击父(运行父级dom上的绑定函数)?还是子(运行子级dom上的绑定函数)?还是父子都点击(如果这样的话是先运行子上的函数还是父上的函数)。

为了解决这一疑惑,就形成了由内而外的冒泡模式和由外到内的捕获模式 如果在冒泡模式下,想精细化的约束某个事件到子,就可以调用阻止冒泡函数,那么父就感受不到此事件了。

如果是没有父子关系的两个dom都占用一个素点,那就更好处理,分别独立运行到这两个dom的绑定函数即可。

二.冒泡和捕获的实现

事件流描述的是从页面接收事件的顺序。IE的事件是冒泡事件,firebox的事件流是捕获事件流

冒泡:从内到外,从具体到不具体

捕获:从外到内,从不具体到具体

若a标签里面仍有span和img等其他元素,上述代码中,单击span.img等其他元素时不会触发click事件。原因:单击span/img等其他元素时,e.target指向的是触发click事件的元素(span、img)而不是a标签

三.如何阻止事件冒泡(取消默认行为)

1.event.stopPropagation();

事件处理过程中,阻止了事件冒泡,但不会阻止默认行为(执行超链接的跳转)

2.returnflase;

事件处理过程中,阻止了事件冒泡,也阻止了默认行为(不执行超链接的跳转)

3.event.preventDefault();

事件处理过程中,不阻止事件冒泡,但阻止事件默认行为(他只执行所有弹框,却没有执行超链接跳转)

四.事件委托的优缺点

优点:

1.提高JavaScript性能。事件委托可以显著的提高事件的处理速度,减少内存的占用

2.动态的添加DOM元素,不需要因为元素的改动而修改事件的绑定。

缺点:

1.部分事件如focus、blur等无冒泡机制,所以无法委托。

2.事件委托有对子元素的查找过程,委托层级过深,可能会有性能问题。

3.频繁触发的事件如mousemove、mouseout、mouseover等,不适合事件委托。

image.png