这是我参与[第四届青训营]笔记创作活动的第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等,不适合事件委托。