微信小程序 觸控事件
》》》什么是事件
- 事件是視圖層到邏輯層的通訊方式。
- 事件可以將用戶的行為反饋到邏輯層進行處理。
- 事件可以綁定在組件上,當達到觸發事件,就會執行邏輯層中對應的事件處理函數。
- 事件對象可以攜帶額外信息,如id, dataset, touches。
事件的使用方式
在組件中綁定一個事件處理函數。
如bindtap,當用戶點擊該組件的時候會在該頁面對應的Page中找到相應的事件處理函數。
<view id="tapTest" data-hi="MINA" bindtap="tapName"> Click me! </view>
在相應的Page定義中寫上相應的事件處理函數,參數是event。
可以看到log出來的信息大致如下:
事件詳解
事件分類
事件分為冒泡事件和非冒泡事件:
冒泡事件:當一個組件上的事件被觸發后,該事件會向父節點傳遞。
非冒泡事件:當一個組件上的事件被觸發后,該事件不會向父節點傳遞。
》》》事件分類
- touchstart 手指觸摸
- touchmove 手指觸摸后移動
- touchcancel 手指觸摸動作被打斷,如彈窗和來電提醒
- touchend 手指觸摸動作結束
- tap 手指觸摸后離開
- longtap 手指觸摸后后,超過350ms離開
》》》事件綁定
事件綁定的寫法同組件的屬性,以 key、value 的形式。
- key 以bind或catch開頭,然后跟上事件的類型,如bindtap, catchtouchstart
- value 是一個字符串,需要在對應的 Page 中定義同名的函數。不然當觸發事件的時候會報錯。 bind事件綁定不會阻止冒泡事件向上冒泡,catch事件綁定可以阻止冒泡事件向上冒泡。
上面簡單介紹了小程序事件基礎,是時候彰顯"事件"的威力:
- 單擊(tap)
- 雙擊(dbtap)
- 長按(longtap)
- 滑動
- 多點觸控
1.單擊
單擊事件由touchstart、touchend組成,touchend后觸發tap事件。
- <view>
- <button type="primary"bindtouchstart="mytouchstart"bindtouchend="mytouchend"bindtap="mytap">點我吧</button>
- </view>
- mytouchstart: function(e){ console.log(e.timeStamp +'- touch start')
- },mytouchend: function(e){ console.log(e.timeStamp +'- touch end')
- },mytap: function(e){ console.log(e.timeStamp +'- tap')
- }
2.雙擊
雙擊事件由兩個單擊事件組成,兩次間隔時間小于300ms認為是雙擊;微信官方文檔沒有雙擊事件,需要開發者自己定義處理。
3.長按
長按事件手指觸摸后,超過350ms再離開。
單擊、雙擊、長按屬于點觸事件,會觸發touchstart、touchend、tap事件,touchcancel事件只能在真機模擬,不多說了。
事件 | 觸發順序 |
---|---|
單擊 | touchstart → touchend → tap |
雙擊 | touchstart → touchend → tap → touchstart → touchend → tap |
長按 | touchstart → longtap → touchend → tap |
4.滑動
手指觸摸屏幕并移動,為了簡化起見,下面以水平滑動和垂直滑動為例。 滑動事件由touchstart、touchmove、touchend組成
坐標圖:
- 以屏幕左上角為原點建立直角坐標系。第四象限為手機屏幕,Y軸越往下坐標值越大(注意跟數學象限的區別)。
- 假設A點為touchstart事件觸摸點,坐標為A(ax,ay),然后手指向上滑動到點B(bx,by),就滿足條件by < ay;
- 同理,向右滑動到C(cx,cy),滿足cx > ax;向下滑動到D(dx,dy),滿足dy > ay;向左移動到E(ex,ey)滿足ex < ax.
- 計算線段AB在Y軸上投影長度為m,在X軸上的投影長度為n
- 計算r = m/n,如果r > 1,視為向上滑動。
- 同理計算線段AC,AD,AE在Y軸投影長度與X軸的投影長度之比,得出向右向下向左的滑動。
以上沒考慮r為1的情況。
- mytouchstart: function (e) {
- var that = this;
- //開始觸摸,獲取觸摸坐標
- console.log(e)
- that.setData({ startpoint: [e.touches[0].pageX, e.touches[0].pageY] });
- },
- //觸摸點移動
- mytouchmove: function (e) {
- //當前觸摸點坐標
- var that = this;
- var curPoint = [e.touches[0].pageX, e.touches[0].pageY];
- var startpoint = that.data.startpoint;
- console.log(startpoint)
- console.log(curPoint)
- //比較pagex值
- if (curPoint[0] < startpoint[0]) {
- if (Math.abs(curPoint[0] - startpoint[0]) >= Math.abs(curPoint[1] - startpoint[1])) {
- console.log(e.timestamp + '-touch left move')
- that.setData({
- dellStyle: "dellList"
- })
- } else {
- if (curPoint[1] >= startpoint[1]) {
- console.log(e.timestamp + '-touch down move')
- } else {
- console.log(e.timestamp + '-touch up move')
- }
- }
- } else {
- if (Math.abs(curPoint[0] - startpoint[0] >= Math.abs(curPoint[1] - startpoint[1]))) {
- console.log(e.timestamp + '-touch right move')
- that.setData({
- dellStyle: "modList"
- })
- } else {
- if (curPoint[1] >= startpoint[1]) {
- console.log(e.timestamp + '-touch down move')
- } else {
- console.log(e.timestamp + '-touch up move')
- }
- }
- }
- },
5.多點觸控
由于模擬器尚不支持多點觸控,內測開放后,繼續補充。
實際使用中遇到的坑;
本身使用的是 scroll-view 進行下拉刷新事件,想在頁面list里面進行左滑動喚醒刪除菜單,實際上寫出來會沖突導致 scroll事件無法觸發,默認滑動事件了。
長按:touchstart → longtap → touchend → tap
本身list綁定了單擊事件點擊進入詳情頁,準備增加一個長按喚醒操作菜單,實際體驗并不好,長按之后手指不能直接離開屏幕那樣會觸發點擊事件,需要輕微移動一下離開屏幕。
解決思路
前端綁定三個事件
- bindtouchstart="mytouchstart" bindtouchend="mytouchend" bindtap="bindtap"
js處理通過點擊開始結束判斷點擊屏幕時間,進行不同的業務觸發
- bindtap: function (e) {
- var that = this;
- //觸摸時間距離頁面打開的毫秒數
- var touchTime = that.data.touch_end - that.data.touch_start
- console.log(touchTime)
- //如果按下時間大于350為長按
- if (touchTime > 350) {
- wx.showModal({
- title: '提示',
- content: '這是一個模態彈窗',
- success: function (res) {
- if (res.confirm) {
- console.log('用戶點擊確定')
- } else if (res.cancel) {
- console.log('用戶點擊取消')
- }
- }
- })
- } else {
- var id = e.currentTarget.dataset.id;
- wx.navigateTo({
- url: '../detail/detail?id=' + id
- })
- }
- },
- //按下事件開始
- mytouchstart: function (e) {
- let that = this;
- that.setData({
- touch_start: e.timeStamp
- })
- console.log(e.timeStamp + '- touch-start')
- },
- //按下事件結束
- mytouchend: function (e) {
- let that = this;
- that.setData({
- touch_end: e.timeStamp
- })
- console.log(e.timeStamp + '- touch-end')
- },

責任編輯:售電衡衡
-
權威發布 | 新能源汽車產業頂層設計落地:鼓勵“光儲充放”,有序推進氫燃料供給體系建設
2020-11-03新能源,汽車,產業,設計 -
中國自主研制的“人造太陽”重力支撐設備正式啟運
2020-09-14核聚變,ITER,核電 -
探索 | 既耗能又可供能的數據中心 打造融合型綜合能源系統
2020-06-16綜合能源服務,新能源消納,能源互聯網
-
新基建助推 數據中心建設將迎爆發期
2020-06-16數據中心,能源互聯網,電力新基建 -
泛在電力物聯網建設下看電網企業數據變現之路
2019-11-12泛在電力物聯網 -
泛在電力物聯網建設典型實踐案例
2019-10-15泛在電力物聯網案例
-
權威發布 | 新能源汽車產業頂層設計落地:鼓勵“光儲充放”,有序推進氫燃料供給體系建設
2020-11-03新能源,汽車,產業,設計 -
中國自主研制的“人造太陽”重力支撐設備正式啟運
2020-09-14核聚變,ITER,核電 -
能源革命和電改政策紅利將長期助力儲能行業發展
-
探索 | 既耗能又可供能的數據中心 打造融合型綜合能源系統
2020-06-16綜合能源服務,新能源消納,能源互聯網 -
5G新基建助力智能電網發展
2020-06-125G,智能電網,配電網 -
從智能電網到智能城市