addeventlistener事件第三个参数_DOM事件的简单思考

语法

element.addEventListener('click', function () {

 }, false);
  • addEventListener()来绑定事件
  • 第一个参数 : ''事件名"
  • 第二个参数 : ''事件响应函数''
  • 第三个参数 : "事件执行时机" 默认是false
  • false表示冒泡阶段执行
  • true表示捕获阶段执行

理解

  • 阻止默认事件
  • e.preventDefault()
  • 阻止冒泡
  • e.stopPropagation()
  • jQuery的话
  • el.on('事件名',false)
  • false作用就相当于阻止默认事件和阻止冒泡

深入了解

DOM事件触发的完整流程

v2-b6825197f2d7b716b798ecc814d644c2_b.jpg

问题:

  • 为什么事件的发生要分为两个阶段?

历史原因: 微软和其他人打架

  • 事件是怎么触发的?

事件可以在捕获阶段触发,也可以在冒泡阶段触发,我们通常会选择在冒泡阶段触发

  • 事件触发的效果理解

事件触发的效果

实现点击隐藏图层的案例

JS Bin​js.jirengu.com
v2-431c5bc6e396131dd6a529c496785f78_ipico.jpg

我们先点击button的时候,只触发fn1,可是冒泡原理让fn2 也触发了

JS Bin​js.jirengu.com
v2-431c5bc6e396131dd6a529c496785f78_ipico.jpg

在div.wrap 层(button的上一层),阻止冒泡,这样document的fn2就不会执行

我们点击wrap以外的区域时,自然会触发fn2, 隐藏掉样式

问题:

  1. 如何做到再次点击button的时候,也隐藏掉样式呢? 这样让用户体验更好啊!
  2. 绑定的事件太多了? 为了节省内存,应该要优化? 如何优化呢?

优化方案1

为了优化内存,选择把document的事件只绑定一次,事件执行结束,就立马解绑!

JS Bin​js.jirengu.com
v2-431c5bc6e396131dd6a529c496785f78_ipico.jpg

解决方案

  1. 在wrap层阻止冒泡,从而让fn2不执行,下次点击wrap以外的地方时,再触发就好了吗,触发一次,这个事件就自动解绑了
  2. 反思:
    1. 虽然节省了内存,但是用户体验的问题依然存在,所以不是最好方案啊
  3. 设置一个定时器,从而让代码异步
  4. 冒泡阶段执行完成,定时器里面的代码才执行,这样就不会发生click冲突事件了
JS Bin​js.jirengu.com
v2-431c5bc6e396131dd6a529c496785f78_ipico.jpg
    1. 这个代码仍然有问题
    2. 点击两次点我的时候,第三次就没反应了
    3. 出现bug3的原因,就是每次点击都会添加一个fn2到下一次冒泡
    4. 点击按钮 进去下一次冒泡就会导致点击事件冲突
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值