语法
element.addEventListener('click', function () {
}, false);
-
来绑定事件addEventListener()
- 第一个参数 : ''事件名"
- 第二个参数 : ''事件响应函数''
- 第三个参数 : "事件执行时机" 默认是false
- false表示冒泡阶段执行
- true表示捕获阶段执行
理解
- 阻止默认事件
-
e.preventDefault()
- 阻止冒泡
-
e.stopPropagation()
- jQuery的话
-
el.on('事件名',false)
- false作用就相当于阻止默认事件和阻止冒泡
深入了解
DOM事件触发的完整流程
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5iYfJzY0QjNkRTM4M2YlhTO3ImNxcjY3QmMmdTOxUjM4YjYtIjdvwVbvNmLn1WaopnLzMWaw9CXvwlOzBHd0hWPsJXdmYDM3YjZkJGNzQDNl1SOhRGOtETMiVWLwMTZw0yMlBDZ4IzMl1DZpV3ZmITPlBXe0ZyPldWYtl2LcdXZpZ3Lc12bj5SZjVjL5h3byBnLxATLn1Wavw1LcpDc0RHaiojIsJye.jpg)
问题:
- 为什么事件的发生要分为两个阶段?
历史原因: 微软和其他人打架
- 事件是怎么触发的?
事件可以在捕获阶段触发,也可以在冒泡阶段触发,我们通常会选择在冒泡阶段触发
- 事件触发的效果理解
事件触发的效果
实现点击隐藏图层的案例
JS Binjs.jirengu.com
我们先点击button的时候,只触发fn1,可是冒泡原理让fn2 也触发了
JS Binjs.jirengu.com
在div.wrap 层(button的上一层),阻止冒泡,这样document的fn2就不会执行
我们点击wrap以外的区域时,自然会触发fn2, 隐藏掉样式
问题:- 如何做到再次点击button的时候,也隐藏掉样式呢? 这样让用户体验更好啊!
- 绑定的事件太多了? 为了节省内存,应该要优化? 如何优化呢?
为了优化内存,选择把document的事件只绑定一次,事件执行结束,就立马解绑!
JS Binjs.jirengu.com
- 在wrap层阻止冒泡,从而让fn2不执行,下次点击wrap以外的地方时,再触发就好了吗,触发一次,这个事件就自动解绑了
- 反思:
- 虽然节省了内存,但是用户体验的问题依然存在,所以不是最好方案啊
- 设置一个定时器,从而让代码异步
- 冒泡阶段执行完成,定时器里面的代码才执行,这样就不会发生click冲突事件了
JS Binjs.jirengu.com
-
- 这个代码仍然有问题
- 点击两次点我的时候,第三次就没反应了
- 出现bug3的原因,就是每次点击都会添加一个fn2到下一次冒泡
- 点击按钮 进去下一次冒泡就会导致点击事件冲突