【微信小程序】事件

一切以官網爲準

1.關鍵字 bindtap,catchtap,mut-bind

<!--  bindtap,catchtap,mut-bind 互換-->
<view id="tapTest" data-hi="WeChat" bindtap="tapName"> Click me! </view>
tapName: function () {
    console.log("我被點擊了")
  },

2.事件分類

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

  1. 冒泡事件:當一個組件上的事件被觸發後,該事件會向父節點傳遞。
  2. 非冒泡事件:當一個組件上的事件被觸發後,該事件不會向父節點傳遞。

WXML的冒泡事件列表:

類型 觸發條件 最低版本
touchstart 手指觸摸動作開始
touchmove 手指觸摸後移動
touchcancel 手指觸摸動作被打斷,如來電提醒,彈窗
touchend 手指觸摸動作結束
tap 手指觸摸後馬上離開
longpress 手指觸摸後,超過350ms再離開,如果指定了事件回調函數並觸發了這個事件,tap事件將不被觸發 1.5.0
longtap 手指觸摸後,超過350ms再離開(推薦使用longpress事件代替)
transitionend 會在 WXSS transition 或 wx.createAnimation 動畫結束後觸發
animationstart 會在一個 WXSS animation 動畫開始時觸發
animationiteration 會在一個 WXSS animation 一次迭代結束時觸發
animationend 會在一個 WXSS animation 動畫完成時觸發
touchforcechange 在支持 3D Touch 的 iPhone 設備,重按時會觸發 1.9.90

注:除上表之外的其他組件自定義事件如無特殊聲明都是非冒泡事件,如 form 的submit事件,input 的input事件,scroll-view 的scroll事件,(詳見各個組件)

3.普通事件綁定

事件綁定的寫法類似於組件的屬性,如:

<view bindtap="handleTap">
    Click here!
</view>

如果用戶點擊這個 view ,則頁面的 handleTap 會被調用。
事件綁定函數可以是一個數據綁定,如:

<view bindtap="{{ handlerName }}">
    Click here!
</view>

4.綁定並阻止事件冒泡

除 bind 外,也可以用 catch 來綁定事件。與 bind 不同, catch 會阻止事件向上冒泡。

例如在下邊這個例子中,點擊 inner view 會先後調用handleTap3和handleTap2(因爲tap事件會冒泡到 middle view,而 middle view 阻止了 tap 事件冒泡,不再向父節點傳遞),點擊 middle view 會觸發handleTap2,點擊 outer view 會觸發handleTap1。

<view id="outer" bindtap="handleTap1">
  outer view
  <view id="middle" catchtap="handleTap2">
    middle view
    <view id="inner" bindtap="handleTap3">
      inner view
    </view>
  </view>
</view>

測試一下就明白了

5.互斥事件綁定

自基礎庫版本 2.8.2 起,除 bind 和 catch 外,還可以使用 mut-bind 來綁定事件。一個 mut-bind 觸發後,如果事件冒泡到其他節點上,其他節點上的 mut-bind 綁定函數不會被觸發,但 bind 綁定函數和 catch 綁定函數依舊會被觸發。

換而言之,所有 mut-bind 是“互斥”的,只會有其中一個綁定函數被觸發。同時,它完全不影響 bind 和 catch 的綁定效果。

例如在下邊這個例子中,點擊 inner view 會先後調用 handleTap3 和 handleTap2 ,點擊 middle view 會調用 handleTap2 和 handleTap1 。

<view id="outer" mut-bind:tap="handleTap1">
  outer view
  <view id="middle" bindtap="handleTap2">
    middle view
    <view id="inner" mut-bind:tap="handleTap3">
      inner view
    </view>
  </view>
</view>

6. data-* 屬性

<view id="tapTest" data-hi="WeChat" bindtap="tapName"> Click me! </view>

在相應的Page定義中寫上相應的事件處理函數,參數是event。

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

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

{
  "type":"tap",
  "timeStamp":895,
  "target": {
    "id": "tapTest",
    "dataset":  {
      "hi":"WeChat"
    }
  },
  "currentTarget":  {
    "id": "tapTest",
    "dataset": {
      "hi":"WeChat"
    }
  },
  "detail": {
    "x":53,
    "y":14
  },
  "touches":[{
    "identifier":0,
    "pageX":53,
    "pageY":14,
    "clientX":53,
    "clientY":14
  }],
  "changedTouches":[{
    "identifier":0,
    "pageX":53,
    "pageY":14,
    "clientX":53,
    "clientY":14
  }]
}

一切以官網爲準

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章