百度智能小程序 事件處理

2020-09-05 15:17 更新

事件提供了一種可以將用戶的行為從視圖層反饋到邏輯層進行處理的通訊方式。觸發(fā)綁定在組件上的事件的時候,就會執(zhí)行邏輯層中對應的事件處理函數(shù),同時也可以傳遞數(shù)據(jù),例如 id,dataset 等。

事件示例

目標:在組件中綁定一個事件處理函數(shù) bindtap 。

模板:

<view id="swanTap" data-say="hello" bindtap="tapHandle"> 點擊 </view>

定義事件的處理函數(shù):

Page({
    tapHandle(e) {
        swan.showToast(e.currentTarget.dataset.say);
    }
});

效果:當用戶單擊組件時,顯示:"hello"。

事件的分類

與瀏覽器的 DOM 事件類似,智能小程序的視圖中事件分為冒泡事件和非冒泡事件。

  • 冒泡事件指的是當組件上的事件被觸發(fā)后,該事件會向父節(jié)點傳遞;
  • 非冒泡事件指的是當組件上的事件被觸發(fā)后,該事件不會向父節(jié)點傳遞;
  • 原生組件video、live-player、canvas、cover-view、cover-image等從基礎庫1.12.0開始支持冒泡。

冒泡事件如下表,不在列表的事件均為非冒泡事件。

事件類型觸發(fā)時機
tap觸摸后馬上離開
longtap觸摸后超過 350ms 再離開(推薦使用 longpress 事件代替)
longpress觸摸后超過 350ms 再離開,如果是指定了事件回調函數(shù)并觸發(fā)了這個事件,tap 事件將不被觸發(fā)
touchstart觸摸開始時
touchmove觸摸后移動時
touchcancel觸摸后被打斷時,如來電等
touchend觸摸結束時
touchforcechange支持 3D Touch 的 iPhone 設備,重按時會觸發(fā)。
transitionend會在 transition 或 swan.createAnimation 動畫結束后觸發(fā)
animationstart會在 animation 動畫開始時觸發(fā)
animationiteration會在 animation 一次迭代結束時觸發(fā)
animationend會在 animation 動畫完成時觸發(fā)

事件綁定和冒泡

事件綁定在組件上,與屬性的寫法相同(以 key、value 的形式)。

  • key 以 bind 或 catch 開頭,銜接事件類型,例如 bindtap、catchtouchcancel。也可以在 bind 和 catch 后可以緊跟一個冒號,如 bind:tap、catch:touchstart,其功能不變。
  • bind 與 catch 的區(qū)別是 bind 事件綁定不會阻止冒泡事件向上冒泡,catch 事件綁定可以阻止冒泡事件向上冒泡;
  • value 對應的是在 Page 中定義同名的函數(shù),否則在事件觸發(fā)時執(zhí)行函數(shù)會拋出異常。

代碼示例

<view id="wrap" bindtap="handleTap1">
    wrap
    <view id="module" catchtap="handleTap2">
        module
        <view id="text" bindtap="handleTap3">
            text
        </view>
    </view>
</view>

效果:

  • 用戶單擊 text 會先后調用 handleTap3 和 handleTap2。這是因為 tap 事件冒泡到了 module,而 module 阻止了 tap 事件冒泡,不再向父節(jié)點傳遞;
  • 用戶單擊 module 會觸發(fā) handleTap2;
  • 用戶單擊 wrap 會觸發(fā) handleTap1。

事件的捕獲

捕獲階段是位于冒泡階段之前,在捕獲階段中,事件到達節(jié)點的順序與冒泡階段恰好相反。在捕獲階段監(jiān)聽的方式是采用capture-bind、capture-catch關鍵字,后者將中斷捕獲階段和取消冒泡階段。

代碼示例:capture-bind

<view id="wrap" bind:touchstart="handleTap1" capture-bind:touchstart="handleTap2">
    wrap
    <view id="inner" bind:touchstart="handleTap3" capture-bind:touchstart="handleTap4">
        text
    </view>
</view>

效果:

  • 用戶單擊 text 會先后調用 handleTap2、handleTap4、handleTap3、handleTap1。

代碼示例:capture-catch

<view id="wrap" bind:touchstart="handleTap1" capture-catch:touchstart="handleTap2">
    wrap
    <view id="inner" bind:touchstart="handleTap3" capture-bind:touchstart="handleTap4">
        text
    </view>
</view>

效果:

  • 用戶單擊 text 只會調用 handleTap2。

事件對象

默認當組件觸發(fā)事件時,邏輯層綁定事件的處理函數(shù)會收到一個默認參數(shù),即事件對象。

下面是事件對象詳細屬性列表:

屬性類型說明
typeString事件的類型
timeStampInteger事件觸發(fā)的時間戳(毫秒)
targetObject觸發(fā)事件的組件的屬性值集合
currentTargetObject當前組件的一些屬性值集合
detailObject自定義事件對象屬性列表
touchesArray觸摸事件類型存在,存放當前停留在屏幕中的觸摸點信息的數(shù)組
changedTouchesArray觸摸事件類型存在,存放當前變化的觸摸點信息的數(shù)組, changedTouch changedTouch

代碼示例 : 

在開發(fā)者工具中打開

<view id="outer" catchtap="handleTap">
    <view id="inner">點擊我</view>
</view>

下面是事件對象的屬性為屬性值集合時的詳細信息。這里需要注意的是 target 和 currentTarget 的區(qū)別,currentTarget 為當前事件所綁定的組件,而 target 則是觸發(fā)該事件的源頭組件。

target

屬性類型說明
idString觸發(fā)事件組件的 id
tagNameString觸發(fā)事件組件的類型
datasetObject觸發(fā)事件組件上由 data-開頭的自定義屬性組成的集合,

currentTarget

屬性類型說明
idString事件綁定的組件的 id
tagNameString事件綁定的組件的類型
datasetObject事件綁定的組件上由 data-開頭的自定義屬性組成的集合

detail

是自定義事件所攜帶的數(shù)據(jù)。

dataset

在組件的事件被觸發(fā)時,也可以傳遞自定義的數(shù)據(jù)。書寫方式: 以 data- 開頭,多個單詞由連字符-鏈接,不能有大寫(大寫會自動轉成小寫),最終的 - 在 dataset 中會將連字符轉成駝峰式寫法。如組件上data-car-color屬性值的讀取方式是: event.currentTarget.dataset.carColor。

touch

屬性類型說明
identifierNumber觸摸點的標識符
clientX, clientYNumber距離頁面可顯示區(qū)域(屏幕除去導航條)左上角的 X 軸與 Y 軸的距離
pageX, pageYNumber距離文檔左上角的 X 軸與 Y 軸的距離

changedTouch

數(shù)據(jù)格式同 touches,指的是有變化的觸摸點,如 touchstart(開始),touchmove(變化),touchend,touchcancel(結束)等。

點擊事件的 detail 帶有的 x, y 同 pageX, pageY 代表距離文檔左上角的距離。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號