image
这是666计划的49篇笔记
什么是事件
- 事件是视图层到逻辑层的通讯方式。
- 事件可以将用户的行为反馈到逻辑层进行处理。
- 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。
- 事件对象可以携带额外信息,如 id, dataset, touches。
代码:
index.wxml:
<view id="tapTest" data-hi="WeChat" bindtap="tapName"> Click me! </view>
index.js:
Page({
tapName: function(event) {
console.log(event)
}
})
小程序事件模型
image
事件捕获阶段: 从最外层节点向下传播到目标节点, 依次检查我们经过的节点是否绑定了同一事件类型的监听回调函数。
事件处理阶段: 执行具体的函数。
事件冒泡阶段:从目标节点向上冒泡到最外层节点,依次检查经过的节点是否也绑定了同一事件类型的监听回调函数。
有哪些可捕获事件
- touchstart 手指按下屏幕
- touchmove
- touchcancel
- touchend
- tap
- longpress
- longtap
可冒泡事件
事件分为冒泡事件和非冒泡事件:
- 冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递。
- 非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递。
WXML的冒泡事件列表:
可冒泡事件里包含所有的可捕获事件。
| 类型 | 触发条件 | 最低版本 |
|---|---|---|
| touchstart | 手指触摸动作开始 | |
| touchmove | 手指触摸后移动 | |
| touchcancel | 手指触摸动作被打断,如来电提醒,弹窗 | |
| touchend | 手指触摸动作结束 | |
| tap | 手指触摸后马上离开 | |
| longpress | 手指触摸后,超过350ms再离开,如果指定了事件回调函数并触发了这个事件,tap事件将不被触发 | 1.5.0 |
| longtap | 手指触摸后,超过350ms再离开(推荐使用longpress事件代替) | |
| transitionend | 会在 WXSS transition 或 wx.createAnimation 动画结束后触发 | |
| animationstart | 会在一个 WXSS animation 动画开始时触发 | |
| animationiteration | 会在一个 WXSS animation 一次迭代结束时触发 | |
| animationend | 会在一个 WXSS animation 动画完成时触发 | |
| touchforcechange | 在支持 3D Touch 的 iPhone 设备,重按时会触发 | 1.9.90 |
注:除上表之外的其他组件自定义事件如无特殊声明都是非冒泡事件,如<form/>的submit事件,<input/>的input事件,<scroll-view/>的scroll事件,(详见各个组件)
代码演示事件
image
index.wxml:
<view class="container-A" bindtap="clickA">
container-A
<view class="container-B" bindtap="clickB">
container-B
<view class="container-C" bindtap="clickC">
container-C
</view>
</view>
</view>
点击container-C的结果:
image
点击container-B的结果:
image
加上capture的事件:
index.wxml:
<view class="container-A" bindtap="clickA" capture-bind:tap="captureclickA">
container-A
<view class="container-B" bindtap="clickB" capture-bind:tap="captureclickA">
container-B
<view class="container-C" bindtap="clickC" capture-bind:tap="captureclickA">
container-C
</view>
</view>
</view>
index.js:
clickA() {
console.log('click container-A')
},
clickB() {
console.log('click container-B')
},
clickC() {
console.log('click container-C')
},
captureclickA() {
console.log('capture click container-A')
},
captureclickB() {
console.log('capture click container-B')
},
captureclickC() {
console.log('capture click container-C')
}
点击container-C的结果:
image
capture是和click的方向相反
点击container-B的结果:
image
结论: click是从当前节点向上冒泡执行; capture是从根部开始执行到当前节点
hongjun














网友评论