TTML-事件

什么是事件

  • 事件是视图层到逻辑层的通讯方式。
  • 事件可以将用户的行为反馈到逻辑层进行处理。
  • 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。
  • 事件对象可以携带额外信息,如 id, dataset, touches。

在组件上绑定事件

bindtap,当用户点击该组件的时候会在该页面对应的Page中找到相应的事件处理函数。

  1. <!-- index.ttml -->
  2. <view id="tapTest" data-hi="bytedance" bindtap="tapName"> Click me! </view>
  1. Page({
  2. tapName: function(event) {
  3. console.log(event)
  4. }
  5. })

上面的console.log 打印出来的event对象的信息大致如下:

  1. {
  2. "type":"tap",
  3. "timeStamp":895,
  4. "target": {
  5. "id": "tapTest",
  6. "dataset": {
  7. "hi":"bytedance"
  8. }
  9. },
  10. "currentTarget": {
  11. "id": "tapTest",
  12. "dataset": {
  13. "hi":"bytedance"
  14. }
  15. },
  16. "detail": {
  17. "x":53,
  18. "y":14
  19. },
  20. "touches":[{
  21. "identifier":0,
  22. "pageX":53,
  23. "pageY":14,
  24. "clientX":53,
  25. "clientY":14
  26. }],
  27. "changedTouches":[{
  28. "identifier":0,
  29. "pageX":53,
  30. "pageY":14,
  31. "clientX":53,
  32. "clientY":14
  33. }]
  34. }

事件详情说明:

事件分为冒泡事件非冒泡事件

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

冒泡事件

类型触发条件
touchstart手指触摸动作开始
touchmove手指触摸后移动
touchcancel手指触摸动作被打断,如来电提醒,弹窗
touchend手指触摸动作结束
tap手指触摸后马上离开
longpress手指触摸后,超过350ms再离开,如果指定了事件回调函数并触发了这个事件,tap事件将不被触发
longtap手指触摸后,超过350ms再离开(推荐使用longpress事件代替)
transitionend会在 TTSS transition 或 tt.createAnimation 动画结束后触发
animationstart会在一个 TTSS animation 动画开始时触发
animationiteration会在一个 TTSS animation 一次迭代结束时触发
animationend会在一个 TTSS animation 动画完成时触发
touchforcechange在支持 3D Touch 的 iPhone 设备,重按时会触发

事件绑定和冒泡

事件绑定的写法同组件的属性,以 key、value 的形式。

  • key 以bind开头,然后跟上事件的类型,如bindtap。

  • value 是一个字符串,需要在对应的 Page 中定义同名的函数。不然当触发事件的时候会报错。

事件对象

如无特殊说明,当组件触发事件时,逻辑层绑定该事件的处理函数会收到一个事件对象。

BaseEvent 基础事件对象属性列表:
属性类型说明
typeString事件类型
timeStampInteger事件生成时的时间戳
targetObject触发事件的组件的一些属性值集合
currentTargetObject当前组件的一些属性值集合
CustomEvent 自定义事件对象属性列表(继承 BaseEvent):
属性类型说明
detailObject额外的信息
TouchEvent 触摸事件对象属性列表(继承 BaseEvent):
属性类型说明
touchesArray触摸事件,当前停留在屏幕中的触摸点信息的数组
changedTouchesArray触摸事件,当前变化的触摸点信息的数组

特殊事件: <canvas/> 中的触摸事件不可冒泡,所以没有 currentTarget。

target

触发事件的组件的一些属性值集合;

属性类型说明
idString事件源组件的id
tagNameString当前组件的类型
datasetObject事件源组件上由data-开头的自定义属性组成的集合
currentTarget

事件绑定的当前组件。

属性类型说明
idString当前组件的id
tagNameString当前组件的类型
datasetObject当前组件上由data-开头的自定义属性组成的集合
dataset

在组件中可以定义数据,这些数据将会通过事件传递给 SERVICE。 书写方式: 以data-开头,多个单词由连字符-链接,不能有大写(大写会自动转成小写)如data-element-type,最终在 event.currentTarget.dataset 中会将连字符转成驼峰elementType

demo:

  1. <!-- index.ttml -->
  2. <view data-alpha-beta="1" data-alphaBeta="2" bindtap="bindViewTap"> DataSet Test </view>
  1. Page({
  2. bindViewTap:function(event){
  3. event.currentTarget.dataset.alphaBeta === 1 // - 会转为驼峰写法
  4. event.currentTarget.dataset.alphabeta === 2 // 大写会转为小写
  5. }
  6. })

touches

touches 是一个数组,每个元素为一个 Touch 对象(canvas 触摸事件中携带的 touches 是 CanvasTouch 数组)。 表示当前停留在屏幕上的触摸点。

Touch 对象
属性类型说明
identifierNumber触摸点的标识符
pageX, pageYNumber距离文档左上角的距离,文档的左上角为原点 ,横向为X轴,纵向为Y轴
clientX, clientYNumber距离页面可显示区域(屏幕除去导航条)左上角距离,横向为X轴,纵向为Y轴
CanvasTouch 对象
属性类型说明
identifierNumber触摸点的标识符
x, yNumber距离 Canvas 左上角的距离,Canvas 的左上角为原点 ,横向为X轴,纵向为Y轴
changedTouches

changedTouches 数据格式同 touches。 表示有变化的触摸点,如从无变有(touchstart),位置变化(touchmove),从有变无(touchend、touchcancel)。

原文: https://developer.toutiao.com/docs/framework/ttml_event.html