支付寶小程序框架 事件·events

2018-09-30 14:50 更新

支付寶小程序框架events事件

簡介

什么是事件?

  • 事件是視圖層到邏輯層的通訊方式。
  • 事件可以將用戶的行為反饋到邏輯層進(jìn)行處理。
  • 事件可以綁定在組件上,當(dāng)達(dá)到觸發(fā)條件,就會(huì)執(zhí)行邏輯層中對(duì)應(yīng)的事件函數(shù)。
  • 事件對(duì)象可以攜帶額外信息,如 id, dataset, touches

使用方式

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

  1. 冒泡事件:當(dāng)一個(gè)組件上的事件被觸發(fā)后,該事件會(huì)向父節(jié)點(diǎn)傳遞。
  2. 非冒泡事件:當(dāng)一個(gè)組件上的事件被觸發(fā)后,該事件不會(huì)向父節(jié)點(diǎn)傳遞。

事件綁定的寫法同組件的屬性,以 key、value 的形式。

  • keyoncatch開頭,然后跟上事件的類型,onTap, catchTap
  • value 是一個(gè)字符串,需要在對(duì)應(yīng)的 Page 中定義同名的函數(shù)。不然當(dāng)觸發(fā)事件的時(shí)候會(huì)報(bào)錯(cuò)。 on 事件綁定不會(huì)阻止冒泡事件向上冒泡,catch 事件綁定可以阻止冒泡事件向上冒泡。

<view id="outter" onTap="handleTap1">
  view1
  <view id="middle" catchTap="handleTap2">
    view2
    <view id="inner" onTap="handleTap3">
      view3
    </view>
  </view>
</view>

上面代碼中,點(diǎn)擊 view3 會(huì)先后觸發(fā) handleTap3handleTap2(因?yàn)?tap 事件會(huì)冒泡到 view2,而 view2 阻止了 tap 事件冒泡,不再向父節(jié)點(diǎn)傳遞),點(diǎn)擊 view2 會(huì)觸發(fā) handleTap2,點(diǎn)擊 view1 會(huì)觸發(fā) handleTap1。

冒泡事件列表:

類型 觸發(fā)條件
touchStart 觸摸動(dòng)作開始
touchMove 觸摸后移動(dòng)
touchEnd 觸摸動(dòng)作結(jié)束
touchcancel 觸摸動(dòng)作被打斷,如來電提醒,彈窗
tap 觸摸后馬上離開
longTap 觸摸后,超過300ms再離開

其他事件不冒泡

(1)在組件中綁定一個(gè)事件處理函數(shù)。

onTap,當(dāng)用戶點(diǎn)擊該組件的時(shí)候會(huì)在該頁面對(duì)應(yīng)的Page中找到對(duì)應(yīng)的事件處理函數(shù)。

<view id="tapTest" data-hi="Alipay" onTap="tapName">
  <view id="tapTestInner" data-hi="AlipayInner">
    Click me! 
  </view>
</view>

(2)在相應(yīng)的Page定義中寫上相應(yīng)的事件處理函數(shù),參數(shù)是event。

Page({
  tapName(event) {
    console.log(event)
  }
})

可以看到 log 出來的信息大致如下。

{
"type":"tap",
"timeStamp":13245456,
"target": {
  "id": "tapTestInner",
  "dataset":  {
    "hi":"AlipayInner"
  }
},
"currentTarget":  {
  "id": "tapTest",
  "dataset": {
    "hi":"Alipay"
  }
},
"detail": {
  "x":24,
  "y":67
},
"touches":[{
  "identifier":0,
  "pageX":54,
  "pageY":83,
  "clientX":13,
  "clientY":56
}],
"changedTouches":[{
  "identifier":0,
  "pageX":43,
  "pageY":67,
  "clientX":27,
  "clientY":45
}]
}

事件對(duì)象

當(dāng)組件觸發(fā)事件時(shí),邏輯層綁定該事件的處理函數(shù)會(huì)收到一個(gè)事件對(duì)象。

(1)BaseEvent

BaseEvent基礎(chǔ)事件對(duì)象屬性列表。

屬性 類型 描述
type String 事件類型
timeStamp Integer 事件生成時(shí)的時(shí)間戳
target Object 觸發(fā)事件的組件的屬性值集合

(2)CustomEvent

CustomEvent自定義事件對(duì)象屬性列表(繼承BaseEvent)。

屬性 類型 描述
detail Object 額外的信息

(3)TouchEvent TouchEvent觸摸事件對(duì)象屬性列表(繼承BaseEvent)。

屬性 類型 描述
touches Array 當(dāng)前停留在屏幕中的觸摸點(diǎn)信息的數(shù)組
changedTouches Array 當(dāng)前變化的觸摸點(diǎn)信息的數(shù)組

(4)Type

type:代表事件的類型。

(5)timeStamp

timeStamp:頁面打開到觸發(fā)事件所經(jīng)過的毫秒數(shù)。

(6)target

target:觸發(fā)事件的源組件。

屬性 類型 描述
id String 事件源組件的id
tagName String 當(dāng)前組件的類型
dataset Object 事件源組件上由data-開頭的自定義屬性的集合

dataset

在組件中可以定義數(shù)據(jù),這些數(shù)據(jù)將會(huì)通過事件傳遞給邏輯層。

書寫方式: 以data-開頭,多個(gè)單詞由連字符-鏈接,不能有大寫(大寫會(huì)自動(dòng)轉(zhuǎn)成小寫),如data-element-type,最終會(huì)在event.target.dataset中會(huì)將連字符轉(zhuǎn)成駝峰elementType。

示例代碼:

<view data-alpha-beta="1" data-alphaBeta="2" onTap="bindViewTap"> DataSet Test </view>

Page({
  bindViewTap:function(event){
    event.target.dataset.alphaBeta === 1 // - 會(huì)轉(zhuǎn)為駝峰寫法
    event.target.dataset.alphabeta === 2 // 大寫會(huì)轉(zhuǎn)為小寫
  }
})

touches

touches是一個(gè)數(shù)組,每個(gè)元素為一個(gè)Touch對(duì)象(canvas觸摸事件中攜帶的touchesCanvasTouch的數(shù)組),表示當(dāng)前停留在屏幕上的觸摸點(diǎn)。

(1)Touch 對(duì)象

屬性 類型 描述
identifier Number 觸摸點(diǎn)的標(biāo)識(shí)符
pageX, pageY Number 距離文檔左上角的距離,左上角為原點(diǎn) ,橫向?yàn)閄軸,縱向?yàn)閅軸
clientX, clientY Number 距離頁面可顯示的區(qū)域(屏幕除去導(dǎo)航條)左上角距離,橫向?yàn)閄軸,縱向?yàn)閅軸

(2)CanvasTouch 對(duì)象

屬性 類型 描述
identifier Number 觸摸點(diǎn)的標(biāo)識(shí)符
x, y Number 距離 Canvas 左上角的距離,Canvas 的左上角為原點(diǎn) ,橫向?yàn)閄軸,縱向?yàn)閅軸

(3)changedTouches

changedTouches數(shù)據(jù)格式同touches。 表示有變化的觸摸點(diǎn),如從無變有(touchstart),位置變化(touchmove),從有變無(touchend、touchcancel)。

(4)detail

自定義事件所攜帶的數(shù)據(jù),如表單組件的提交事件會(huì)攜帶用戶的輸入信息,媒體的錯(cuò)誤事件會(huì)攜帶錯(cuò)誤信息,詳細(xì)的描述請(qǐng)參考組件定義中各個(gè)事件的定義。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)