前言
前面我曾写过一篇介绍微信小程序实现二级菜单的小教程,里面留下了一个坑,那就是关于小程序里的事件,当时并没有过多介绍。
对于新人来说,bind
与catch
、event
对象里的target
与currentTarget
是一道门槛,需要我们花点心思去搞明白它们的区别,在工作中才能灵活运用,提高开发效率。
案例
我们从下面的例子来对事件进行详细说明
代码
wxml1
2
3
4
5
6
7
8
9
10
11
12<view class="fl-row" bindtap="parent" data-str="我是最外层的父级">
<view class='item' data-str="我是红色部分">
<view class="li" data-str="我是蓝色部分">
<text class='text' catchtap="child" data-str="我是产品">产品</text>
</view>
</view>
<view class='item'>
<view class="li">
<text class='text'>空间</text>
</view>
</view>
</view>
wxss1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18.fl-row {
display: flex;
flex-direction: row;
margin: 20rpx 0 0 0;
}
.li{
background: blue;
}
.text{
background: yellow;
}
.item {
flex: 1;
text-align: center;
font-weight: bold;
padding: 50rpx 0;
background: red;
}
javascript1
2
3
4
5
6
7
8parent: function (e) {
console.log(e);
console.log("触发了bindTap事件");
},
child: function (e) {
console.log(e);
console.log("触发了catchTap事件");
}
测试
- 点击黄色的文字部分,打印结果如图所示
可以看到,触发了catchtap
事件,event
对象里target
与currentTarget
的自定义数据str
打印的结果都是“我是产品”。
- 点击蓝色部分,打印结果如图所示
这次,触发了bindtap
事件,target
打印结果为“我是蓝色部分”,currentTarget
打印结果为“我是最外层的父级”。没有在蓝色的<view>
添加任何事件,却触发了绑定在父级的bindtap
事件,这就是冒泡事件的机制,js里可以利用冒泡进行事件代理,把事件代码写在父级,在父级内的元素,就算是后来动态添加进去的元素,也会触发该事件。
- 点击红色部分,打印结果如图所示
最后,触发了bindtap
事件,target
打印结果为“我是红色部分”,currentTarget
打印结果为“我是最外层的父级”。
事件详解
事件分类
事件分为冒泡事件和非冒泡事件:
- 冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递。
- 非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递。
微信小程序中的冒泡事件(2.1.1)
类型 | 触发条件 |
---|---|
touchstart | 手指触摸动作开始 |
touchmove | 手指触摸后移动 |
touchcancel | 手指触摸动作被打断,如来电提醒,弹窗 |
touchend | 手指触摸动作结束 |
tap | 手指触摸后马上离开 |
longpress | 手指触摸后,超过350ms再离开,如果指定了事件回调函数并触发了这个事件,tap事件将不被触发 |
longtap | 手指触摸后,超过350ms再离开(推荐使用longpress事件代替) |
transitionend | 会在 WXSS transition 或 wx.createAnimation 动画结束后触发 |
animationstart | 会在一个 WXSS animation 动画开始时触发 |
animationiteration | 会在一个 WXSS animation 一次迭代结束时触发 |
animationend | 会在一个 WXSS animation 动画完成时触发 |
touchforcechange | 在支持 3D Touch 的 iPhone 设备,重按时会触发 |
微信小程序大多都是冒泡事件,优先发生最里面容器设置的事件,然后发生父容器设置的事件
bind与catch区别
bind
事件绑定不会阻止冒泡事件向上冒泡,catch
事件绑定可以阻止冒泡事件向上冒泡。
target与currentTarget
属性 | 说明 |
---|---|
target | 触发事件的组件的一些属性值集合 |
currentTarget | 当前组件的一些属性值集合 |
总结
event.target
指的是触发事件的源组件。点击时所处位置最里面的那个容器 (捕获到最里面时)event.currentTarget
指的是事件绑定的当前组件。点击事件设置的那个容器。(冒泡到最外面时)
测试结果分析
再次回到测试结果
- 点击黄色
target
的目标是触发事件的源组件,这里是黄色文字,currentTarget
目标是设置事件的最外层父级。因为文字部分绑定了catchtap
事件,catch
事件会阻止事件冒泡,因此事件在文字点击后不会继续往上传递。target
与currentTarget
打印结果都是“我是产品”。
点击蓝色
target
的目标是触发事件的源组件,这里是蓝色背景,因此target
打印结果为“我是蓝色”。currentTarget
目标是设置事件的最外层父级,bind
事件不阻止事件冒泡。currentTarget
打印结果为“我是最外层父级”。点击红色
点击红色与点击蓝色时同理。
bind
与catch
、event
对象里的target
与currentTarget
的讲解到这里就结束了。不知道大家有没有对事件有更深一步的理解了呢?