Skip to content

8.7 事件

8.7.1 事件类型

触摸事件

  • touchstart - 手指触摸开始
  • touchmove - 手指触摸后移动
  • touchend - 手指触摸结束
  • touchcancel - 手指触摸动作被打断,如来电提醒,弹窗等

点击事件

  • tap - 手指触摸后马上离开
  • longpress - 手指触摸后,超过350ms再离开,如果指定了事件回调函数并触发了这个事件,tap事件将不被触发
  • longtap - 手指触摸后,超过350ms再离开(推荐使用longpress事件代替)

8.7.2 事件绑定

事件绑定语法

html
<!-- 绑定事件 -->
<view bindtap="handleTap">点击我</view>

<!-- 阻止事件冒泡 -->
<view catchtap="handleTap">点击我</view>

<!-- 绑定多个事件 -->
<view bindtap="handleTap" bindtouchstart="handleTouchStart">点击我</view>

事件绑定方式

  • bind - 事件绑定不会阻止冒泡阶段中事件继续传播
  • catch - 事件绑定后,会阻止事件向上冒泡

8.7.3 事件对象

事件对象属性

属性类型说明
typeString事件类型
timeStampNumber页面打开到触发事件所经过的毫秒数
targetObject触发事件的源组件
currentTargetObject事件绑定的当前组件
datasetObject事件源组件上由data-开头的自定义属性组成的集合
markObject事件触发时,事件冒泡路径上所有的mark会被合并
touchesArray触摸事件,当前停留在屏幕中的触摸点信息的数组
changedTouchesArray触摸事件,当前变化的触摸点信息的数组
detailObject自定义事件所携带的数据

target 和 currentTarget

  • target - 触发事件的源组件
  • currentTarget - 事件绑定的当前组件

示例:

html
<view id="outer" bindtap="handleOuterTap">
  <view id="inner" bindtap="handleInnerTap">内部</view>
</view>
js
Page({
  handleOuterTap(e) {
    console.log('outer tap')
    console.log('target:', e.target.id)        // "inner"
    console.log('currentTarget:', e.currentTarget.id)  // "outer"
  },
  handleInnerTap(e) {
    console.log('inner tap')
    console.log('target:', e.target.id)        // "inner"
    console.log('currentTarget:', e.currentTarget.id)  // "inner"
  }
})

8.7.4 自定义数据

dataset 属性

在组件节点中可以附加一些自定义数据,以 data- 开头:

html
<view data-alpha-beta="1" data-alphaBeta="2" bindtap="bindViewTap">
  DataSet Test
</view>
js
Page({
  bindViewTap(e) {
    console.log(e.currentTarget.dataset.alphaBeta)  // 1 (连字符转驼峰)
    console.log(e.currentTarget.dataset.alphabeta)  // 2 (大写转小写)
  }
})

mark 属性

在基础库版本 2.7.1 以上,可以使用 mark 来识别具体触发事件的 target 节点:

html
<view mark:myMark="last" bindtap="bindViewTap">
  <button mark:anotherMark="leaf" bindtap="bindButtonTap">按钮</button>
</view>
js
Page({
  bindViewTap(e) {
    console.log(e.mark.myMark)        // "last"
    console.log(e.mark.anotherMark)   // "leaf"
  },
  bindButtonTap(e) {
    console.log(e.mark.myMark)        // "last"
    console.log(e.mark.anotherMark)   // "leaf"
  }
})

8.7.5 触摸事件详解

Touch 对象属性

属性类型说明
identifierNumber触摸点的标识符
pageX, pageYNumber距离文档左上角的距离
clientX, clientYNumber距离页面可显示区域左上角距离

CanvasTouch 对象属性

属性类型说明
identifierNumber触摸点的标识符
x, yNumber距离 Canvas 左上角的距离

touches 和 changedTouches

  • touches - 当前停留在屏幕上的触摸点
  • changedTouches - 有变化的触摸点(touchstart、touchmove、touchend、touchcancel)