事件
简介
什么是事件?
- 事件是视图层到逻辑层的通讯方式。
- 事件可以将用户的行为反馈到逻辑层进行处理。
- 事件可以绑定在组件上,当达到触发条件,就会执行逻辑层中对应的事件函数。
- 事件对象可以携带额外信息,如 id, dataset, touches。
使用方式
事件分为冒泡事件和非冒泡事件:
- 冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递。
非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递。
事件绑定的写法同组件的属性,以 key、value 的形式。key 以on或catch开头,然后跟上事件的类型,onTap, catchTap
- value 是一个字符串,需要在对应的 Page 中定义同名的函数。不然当触发事件的时候会报错。
on 事件绑定不会阻止冒泡事件向上冒泡,catch 事件绑定可以阻止冒泡事件向上冒泡。
<view id="outter" onTap="handleTap1">
view1
<view id="middle" catchTap="handleTap2">
view2
<view id="inner" onTap="handleTap3">
view3
</view>
</view>
</view>
上面代码中,点击 view3 会先后触发 handleTap3 和 handleTap2(因为 tap 事件会冒泡到 view2,而 view2 阻止了 tap 事件冒泡,不再向父节点传递),点击 view2 会触发 handleTap2,点击 view1 会触发 handleTap1。
冒泡事件列表:
类型 | 触发条件 |
---|---|
touchStart | 触摸动作开始 |
touchMove | 触摸后移动 |
touchEnd | 触摸动作结束 |
touchCancel | 触摸动作被打断,如来电提醒,弹窗 |
tap | 触摸后马上离开 |
longTap | 触摸后,超过500ms再离开 |
其他事件不冒泡
(1)在组件中绑定一个事件处理函数。
如onTap
,当用户点击该组件的时候会在该页面对应的Page
中找到对应的事件处理函数。
<view id="tapTest" data-hi="Alipay" onTap="tapName">
<view id="tapTestInner" data-hi="AlipayInner">
Click me!
</view>
</view>
(2)在相应的Page定义中写上相应的事件处理函数,参数是event。
Page({
tapName(event) {
console.log(event)
}
})
可以看到 log 出来的信息大致如下。
{
"type": "tap",
"timeStamp": 13245456,
"target": {
"id": "tapTestInner",
"dataset": {
"hi": "Alipay"
},
"targetDataset": {
"hi": "AlipayInner"
}
},
"currentTarget": {
"id": "tapTest",
"dataset": {
"hi": "Alipay"
}
}
}
事件对象
当组件触发事件时,逻辑层绑定该事件的处理函数会收到一个事件对象。
(1)BaseEvent
BaseEvent
基础事件对象属性列表。
属性 | 类型 | 描述 |
---|---|---|
type | String | 事件类型 |
timeStamp | Integer | 事件生成时的时间戳 |
target | Object | 触发事件的组件的属性值集合 |
(2)CustomEvent
CustomEvent
自定义事件对象属性列表(继承BaseEvent
)。
属性 | 类型 | 描述 |
---|---|---|
detail | Object | 额外的信息 |
(3)TouchEvent
TouchEvent
触摸事件对象属性列表(继承BaseEvent
)。
属性 | 类型 | 描述 |
---|---|---|
touches | Array | 当前停留在屏幕中的触摸点信息的数组 |
changedTouches | Array | 当前变化的触摸点信息的数组 |
(4)Type
type
:代表事件的类型。
(5)timeStamp
timeStamp
:页面打开到触发事件所经过的毫秒数。
(6)target
target
:触发事件的源组件。
属性 | 类型 | 描述 |
---|---|---|
id | String | 事件源组件的id |
tagName | String | 当前组件的类型 |
dataset | Object | 绑定事件的组件上由data-开头的自定义属性的集合 |
targetDataset | Object | 实际触发事件的组件上由data-开头的自定义属性的集合 |
dataset
在组件中可以定义数据,这些数据将会通过事件传递给逻辑层。
书写方式: 以data-
开头,多个单词由连字符-链接,不能有大写(大写会自动转成小写),如data-element-type
,最终会在event.target.dataset
中会将连字符转成驼峰elementType
。
示例代码:
<view data-alpha-beta="1" data-alphaBeta="2" onTap="bindViewTap"> DataSet Test </view>
Page({
bindViewTap:function(event){
event.target.dataset.alphaBeta === 1 // - 会转为驼峰写法
event.target.dataset.alphabeta === 2 // 大写会转为小写
}
})
touches
touches
是一个数组,每个元素为一个Touch
对象(canvas
触摸事件中携带的touches
是 CanvasTouch
的数组),表示当前停留在屏幕上的触摸点。
(1)Touch 对象
属性 | 类型 | 描述 |
---|---|---|
identifier | Number | 触摸点的标识符 |
pageX, pageY | Number | 距离文档左上角的距离,左上角为原点 ,横向为X轴,纵向为Y轴 |
clientX, clientY | Number | 距离页面可显示的区域(屏幕除去导航条)左上角距离,横向为X轴,纵向为Y轴 |
(2)CanvasTouch 对象
属性 | 类型 | 描述 |
---|---|---|
identifier | Number | 触摸点的标识符 |
x, y | Number | 距离 Canvas 左上角的距离,Canvas 的左上角为原点 ,横向为X轴,纵向为Y轴 |
(3)changedTouches
changedTouches
数据格式同touches
。 表示有变化的触摸点,如从无变有(touchstart
),位置变化(touchmove
),从有变无(touchend
、touchcancel
)。
(4)detail
自定义事件所携带的数据,如表单组件的提交事件会携带用户的输入信息,媒体的错误事件会携带错误信息,详细的描述请参考组件定义中各个事件的定义。