微信小程序 事件
什么是事件
- 事件是視圖層到邏輯層的通訊方式。
- 事件可以將用戶的行為反饋到邏輯層進(jìn)行處理。
- 事件可以綁定在組件上,當(dāng)達(dá)到觸發(fā)事件,就會(huì)執(zhí)行邏輯層中對(duì)應(yīng)的事件處理函數(shù)。
- 事件對(duì)象可以攜帶額外信息,如id, dataset, touches。
事件的使用方式
- 在組件中綁定一個(gè)事件處理函數(shù)。
如bindtap
,當(dāng)用戶點(diǎn)擊該組件的時(shí)候會(huì)在該頁(yè)面對(duì)應(yīng)的Page中找到相應(yīng)的事件處理函數(shù)。
<view id="tapTest" data-hi="MINA" bindtap="tapName"> Click me! </view>
- 在相應(yīng)的Page定義中寫上相應(yīng)的事件處理函數(shù),參數(shù)是event。
Page({ tapName: function(event) { console.log(event) } })
- 可以看到log出來的信息大致如下
{ "type": "tap", "timeStamp": 1252, "target": { "id": "tapTest", "offsetLeft": 0, "offsetTop": 0, "dataset": { "hi": "MINA" } }, "currentTarget": { "id": "tapTest", "offsetLeft": 0, "offsetTop": 0, "dataset": { "hi": "MINA" } }, "touches": [{ "pageX": 30, "pageY": 12, "clientX": 30, "clientY": 12, "screenX": 112, "screenY": 151 }], "detail": { "x": 30, "y": 12 } }
事件詳解
事件分類
事件分為冒泡事件和非冒泡事件
- 冒泡事件:當(dāng)一個(gè)組件上的事件被觸發(fā)后,該事件會(huì)向父節(jié)點(diǎn)傳遞。
- 非冒泡事件:當(dāng)一個(gè)組件上的事件被觸發(fā)后,該事件不會(huì)向父節(jié)點(diǎn)傳遞。
WXML的冒泡事件列表:
注:除上表之外的其他組件自定義事件都是非冒泡事件,如<form/>
的submit
事件,<input/>
的input
事件,<scroll-view/>
的scroll
事件,(詳見各個(gè)組件)
事件綁定
事件綁定的寫法同組件的屬性,以key、value的形式。
- key以
bind
或catch
開頭,然后跟上事件的類型,如bindtap
,catchtouchstart
- value是一個(gè)字符串,需要在對(duì)應(yīng)的Page中定義同名的函數(shù)。不然當(dāng)觸發(fā)事件的時(shí)候會(huì)報(bào)錯(cuò)。
bind
事件綁定不會(huì)阻止冒泡事件向上冒泡,catch
事件綁定可以阻止冒泡事件向上冒泡。
如在下邊這個(gè)例子中,點(diǎn)擊inner view會(huì)先后觸發(fā)handleTap3
和handleTap2
(因?yàn)閠ap事件會(huì)冒泡到middle view,而middle view阻止了tap事件冒泡,不再向父節(jié)點(diǎn)傳遞),點(diǎn)擊middle view會(huì)觸發(fā)handleTap2
,點(diǎn)擊outter view會(huì)觸發(fā)handleTap1
。
<view id="outter" bindtap="handleTap1"> outer view <view id="middle" catchtap="handleTap2"> middle view <view id="inner" bindtap="handleTap3"> inner view </view> </view> </view>
事件對(duì)象
如無特殊說明,當(dāng)組件觸發(fā)事件時(shí),邏輯層綁定該事件的處理函數(shù)會(huì)收到一個(gè)事件對(duì)象。
事件對(duì)象的屬性列表:
CustomEvent 自定義事件對(duì)象屬性列表(繼承 BaseEvent):
TouchEvent 觸摸事件對(duì)象屬性列表(繼承 BaseEvent):
特殊事件: <canvas/>
中的觸摸事件不可冒泡,所以沒有 currentTarget。
type
通用事件類型
timeStamp
該頁(yè)面打開到觸發(fā)事件所經(jīng)過的毫秒數(shù)。
target
觸發(fā)事件的源組件。
currentTarget
事件綁定的當(dāng)前組件。
說明: target 和 currentTarget 可以參考上例中,點(diǎn)擊 inner view 時(shí),handleTap3
收到的事件對(duì)象 target 和 currentTarget 都是 inner,而 handleTap2
收到的事件對(duì)象 target 就是 inner,currentTarget 就是 middle。
dataset
在組件中可以定義數(shù)據(jù),這些數(shù)據(jù)將會(huì)通過事件傳遞給 SERVICE。 書寫方式: 以data-
開頭,多個(gè)單詞由連字符-
鏈接,不能有大寫(大寫會(huì)自動(dòng)轉(zhuǎn)成小寫)如data-element-type
,最終在 event.target.dataset 中會(huì)將連字符轉(zhuǎn)成駝峰elementType
。
示例:
<view data-alpha-beta="1" data-alphaBeta="2" bindtap="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 觸摸事件中攜帶的 touches 是 CanvasTouch 數(shù)組)。 表示當(dāng)前停留在屏幕上的觸摸點(diǎn)。
Touch 對(duì)象
CanvasTouch 對(duì)象
changedTouches
changedTouches 數(shù)據(jù)格式同 touches。 表示有變化的觸摸點(diǎn),如從無變有(touchstart),位置變化(touchmove),從有變無(touchend、touchcancel)。
detail
自定義事件所攜帶的數(shù)據(jù),如表單組件的提交事件會(huì)攜帶用戶的輸入,媒體的錯(cuò)誤事件會(huì)攜帶錯(cuò)誤信息,詳見組件定義中各個(gè)事件的定義。