微信小程序入门--事件

前言

前面我曾写过一篇介绍微信小程序实现二级菜单的小教程,里面留下了一个坑,那就是关于小程序里的事件,当时并没有过多介绍。

对于新人来说,bindcatchevent对象里的targetcurrentTarget是一道门槛,需要我们花点心思去搞明白它们的区别,在工作中才能灵活运用,提高开发效率。

好了,接下来开始详细介绍它们的区别。

案例

我们从下面的例子来对事件进行详细说明

代码

wxml

1
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>

wxss

1
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;
}

javascript

1
2
3
4
5
6
7
8
parent: function (e) {
console.log(e);
console.log("触发了bindTap事件");
},
child: function (e) {
console.log(e);
console.log("触发了catchTap事件");
}

测试

  1. 点击黄色的文字部分,打印结果如图所示

image

可以看到,触发了catchtap事件,event对象里targetcurrentTarget的自定义数据str打印的结果都是“我是产品”。

  1. 点击蓝色部分,打印结果如图所示

image

这次,触发了bindtap事件,target打印结果为“我是蓝色部分”,currentTarget打印结果为“我是最外层的父级”。没有在蓝色的<view>添加任何事件,却触发了绑定在父级的bindtap事件,这就是冒泡事件的机制,js里可以利用冒泡进行事件代理,把事件代码写在父级,在父级内的元素,就算是后来动态添加进去的元素,也会触发该事件。

  1. 点击红色部分,打印结果如图所示

image

最后,触发了bindtap事件,target打印结果为“我是红色部分”,currentTarget打印结果为“我是最外层的父级”。

事件详解

事件分类

事件分为冒泡事件和非冒泡事件:

  1. 冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递。
  2. 非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递。

微信小程序中的冒泡事件(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 指的是事件绑定的当前组件。点击事件设置的那个容器。(冒泡到最外面时)

测试结果分析

再次回到测试结果

  1. 点击黄色

target的目标是触发事件的源组件,这里是黄色文字,currentTarget目标是设置事件的最外层父级。因为文字部分绑定了catchtap事件,catch事件会阻止事件冒泡,因此事件在文字点击后不会继续往上传递。targetcurrentTarget打印结果都是“我是产品”。

  1. 点击蓝色
    target的目标是触发事件的源组件,这里是蓝色背景,因此target打印结果为“我是蓝色”。currentTarget目标是设置事件的最外层父级,bind事件不阻止事件冒泡。currentTarget打印结果为“我是最外层父级”。

  2. 点击红色
    点击红色与点击蓝色时同理。

bindcatchevent对象里的targetcurrentTarget的讲解到这里就结束了。不知道大家有没有对事件有更深一步的理解了呢?

参考


感谢打赏,错误之处欢迎指正交流(`・ω・´) !~~



文章目录
  1. 1. 前言
  2. 2. 案例
    1. 2.1. 代码
    2. 2.2. 测试
  3. 3. 事件详解
    1. 3.1. 事件分类
    2. 3.2. bind与catch区别
    3. 3.3. target与currentTarget
    4. 3.4. 测试结果分析
  4. 4. 参考
|