亚洲an日韩专区在线-亚洲an天堂an在线观看-亚洲a区视频-亚洲a图-免费黄网大全-免费黄网在线

微信小程序 觸控事件

2018-03-14 14:21:01 腳本之家  點擊量: 評論 (0)
》》》什么是事件事件是視圖層到邏輯層的通訊方式。事件可以將用戶的行為反饋到邏輯層進行處理。事件可以綁定在組件上,當達到觸發事件,就

》》》什么是事件

  1. 事件是視圖層到邏輯層的通訊方式。
  2. 事件可以將用戶的行為反饋到邏輯層進行處理。
  3. 事件可以綁定在組件上,當達到觸發事件,就會執行邏輯層中對應的事件處理函數。
  4. 事件對象可以攜帶額外信息,如id, dataset, touches。

事件的使用方式

在組件中綁定一個事件處理函數。

如bindtap,當用戶點擊該組件的時候會在該頁面對應的Page中找到相應的事件處理函數。

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

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

[html] view plain copy
 
  1. Page({  
  2.  tapName: function(event) {  
  3.  console.log(event)  
  4.  }  
  5. })  

 

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

[html] view plain copy
 
  1. {  
  2. "type":"tap",  
  3. "timeStamp": 1252,  
  4. "target": {  
  5.  "id":"tapTest",  
  6.  "offsetLeft": 0,  
  7.  "offsetTop": 0,  
  8.  "dataset": {  
  9.  "hi":"MINA"  
  10.  }  
  11. },  
  12. "currentTarget": {  
  13.  "id":"tapTest",  
  14.  "offsetLeft": 0,  
  15.  "offsetTop": 0,  
  16.  "dataset": {  
  17.  "hi":"MINA"  
  18.  }  
  19. },  
  20. "touches": [{  
  21.  "pageX": 30,  
  22.  "pageY": 12,  
  23.  "clientX": 30,  
  24.  "clientY": 12,  
  25.  "screenX": 112,  
  26.  "screenY": 151  
  27. }],  
  28. "detail": {  
  29.  "x": 30,  
  30.  "y": 12  
  31. }  
  32. }  

 

事件詳解

事件分類

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

冒泡事件:當一個組件上的事件被觸發后,該事件會向父節點傳遞。

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

》》》事件分類

  1. touchstart 手指觸摸
  2. touchmove 手指觸摸后移動
  3. touchcancel 手指觸摸動作被打斷,如彈窗和來電提醒
  4. touchend 手指觸摸動作結束
  5. tap 手指觸摸后離開
  6. longtap 手指觸摸后后,超過350ms離開

》》》事件綁定

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

  1. key 以bind或catch開頭,然后跟上事件的類型,如bindtap, catchtouchstart
  2. value 是一個字符串,需要在對應的 Page 中定義同名的函數。不然當觸發事件的時候會報錯。 bind事件綁定不會阻止冒泡事件向上冒泡,catch事件綁定可以阻止冒泡事件向上冒泡。

上面簡單介紹了小程序事件基礎,是時候彰顯"事件"的威力:

  1. 單擊(tap)
  2. 雙擊(dbtap)
  3. 長按(longtap)
  4. 滑動
  5. 多點觸控

1.單擊

單擊事件由touchstart、touchend組成,touchend后觸發tap事件。

 

 
[html] view plain copy
 
  1. <view>  
  2.  <button type="primary"bindtouchstart="mytouchstart"bindtouchend="mytouchend"bindtap="mytap">點我吧</button>  
  3. </view>  
  4. mytouchstart: function(e){ console.log(e.timeStamp +'- touch start')  
  5. },mytouchend: function(e){ console.log(e.timeStamp +'- touch end')  
  6. },mytap: function(e){ console.log(e.timeStamp +'- tap')  
  7. }  

 

2.雙擊

雙擊事件由兩個單擊事件組成,兩次間隔時間小于300ms認為是雙擊;微信官方文檔沒有雙擊事件,需要開發者自己定義處理。

 

[html] view plain copy
 
  1. <view>  
  2.  <buttontypebuttontype="primary"bindtap="mytap">點我吧</button>  
  3. </view>  

 


 

 3.長按

長按事件手指觸摸后,超過350ms再離開。

 

[html] view plain copy
 
  1. <view>  
  2.  <button type="primary"bindtouchstart="mytouchstart"bindlongtap="mylongtap"  
  3.  bindtouchend="mytouchend"bindtap="mytap">點我吧</button>  
  4. </view>  
  5. mytouchstart: function(e){ console.log(e.timeStamp +'- touch start')  
  6. },//長按事件mylongtap: function(e){ console.log(e.timeStamp + '- long tap')  
  7.  },mytouchend:function(e){ console.log(e.timeStamp +'- touch end')  
  8. },mytap: function(e){ console.log(e.timeStamp +'- tap')  
  9. }  

 

單擊、雙擊、長按屬于點觸事件,會觸發touchstart、touchend、tap事件,touchcancel事件只能在真機模擬,不多說了。

事件 觸發順序
單擊 touchstart → touchend → tap
雙擊 touchstart → touchend → tap → touchstart → touchend → tap
長按 touchstart → longtap → touchend → tap

 

4.滑動

手指觸摸屏幕并移動,為了簡化起見,下面以水平滑動和垂直滑動為例。 滑動事件由touchstart、touchmove、touchend組成

 

坐標圖:

 

  1. 以屏幕左上角為原點建立直角坐標系。第四象限為手機屏幕,Y軸越往下坐標值越大(注意跟數學象限的區別)。
  2. 假設A點為touchstart事件觸摸點,坐標為A(ax,ay),然后手指向上滑動到點B(bx,by),就滿足條件by < ay;
  3. 同理,向右滑動到C(cx,cy),滿足cx > ax;向下滑動到D(dx,dy),滿足dy > ay;向左移動到E(ex,ey)滿足ex < ax.
  4. 計算線段AB在Y軸上投影長度為m,在X軸上的投影長度為n
  5. 計算r = m/n,如果r > 1,視為向上滑動。
  6. 同理計算線段AC,AD,AE在Y軸投影長度與X軸的投影長度之比,得出向右向下向左的滑動。

以上沒考慮r為1的情況。

[html] view plain copy
 
  1. <view>  
  2.  <buttontypebuttontype="primary"bindtouchstart="mytouchstart"bindtouchmove="mytouchmove">點我吧</button>  
  3. </view>  

 

 

[html] view plain copy
 
  1. mytouchstart: function (e) {  
  2.     var that = this;  
  3.     //開始觸摸,獲取觸摸坐標  
  4.     console.log(e)  
  5.     that.setData({ startpoint: [e.touches[0].pageX, e.touches[0].pageY] });  
  6. },  
  7. //觸摸點移動  
  8. mytouchmove: function (e) {  
  9.     //當前觸摸點坐標  
  10.     var that = this;  
  11.     var curPoint = [e.touches[0].pageX, e.touches[0].pageY];  
  12.     var startpoint = that.data.startpoint;  
  13.     console.log(startpoint)  
  14.     console.log(curPoint)  
  15.     //比較pagex值  
  16.     if (curPoint[0] < startpoint[0]) {  
  17.         if (Math.abs(curPoint[0] - startpoint[0]) >= Math.abs(curPoint[1] - startpoint[1])) {  
  18.             console.log(e.timestamp + '-touch left move')  
  19.             that.setData({  
  20.                 dellStyle: "dellList"  
  21.             })  
  22.         } else {  
  23.             if (curPoint[1] >= startpoint[1]) {  
  24.                 console.log(e.timestamp + '-touch down move')  
  25.             } else {  
  26.                 console.log(e.timestamp + '-touch up move')  
  27.             }  
  28.         }  
  29.     } else {  
  30.         if (Math.abs(curPoint[0] - startpoint[0] >= Math.abs(curPoint[1] - startpoint[1]))) {  
  31.             console.log(e.timestamp + '-touch right move')  
  32.             that.setData({  
  33.                 dellStyle: "modList"  
  34.             })  
  35.         } else {  
  36.             if (curPoint[1] >= startpoint[1]) {  
  37.                 console.log(e.timestamp + '-touch down move')  
  38.             } else {  
  39.                 console.log(e.timestamp + '-touch up move')  
  40.             }  
  41.         }  
  42.     }  
  43. },  


 

 

5.多點觸控

由于模擬器尚不支持多點觸控,內測開放后,繼續補充。

 

實際使用中遇到的坑;

本身使用的是 scroll-view 進行下拉刷新事件,想在頁面list里面進行左滑動喚醒刪除菜單,實際上寫出來會沖突導致 scroll事件無法觸發,默認滑動事件了。

長按:touchstart → longtap → touchend → tap

本身list綁定了單擊事件點擊進入詳情頁,準備增加一個長按喚醒操作菜單,實際體驗并不好,長按之后手指不能直接離開屏幕那樣會觸發點擊事件,需要輕微移動一下離開屏幕。

解決思路

前端綁定三個事件

 

[html] view plain copy
 
  1. bindtouchstart="mytouchstart" bindtouchend="mytouchend"  bindtap="bindtap"  


js處理通過點擊開始結束判斷點擊屏幕時間,進行不同的業務觸發

 

[html] view plain copy
 
  1. bindtap: function (e) {  
  2.     var that = this;  
  3.     //觸摸時間距離頁面打開的毫秒數    
  4.     var touchTime = that.data.touch_end - that.data.touch_start  
  5.     console.log(touchTime)  
  6.     //如果按下時間大于350為長按    
  7.     if (touchTime > 350) {  
  8.         wx.showModal({  
  9.             title: '提示',  
  10.             content: '這是一個模態彈窗',  
  11.             success: function (res) {  
  12.                 if (res.confirm) {  
  13.                     console.log('用戶點擊確定')  
  14.                 } else if (res.cancel) {  
  15.                     console.log('用戶點擊取消')  
  16.                 }  
  17.             }  
  18.         })  
  19.     } else {  
  20.         var id = e.currentTarget.dataset.id;  
  21.         wx.navigateTo({  
  22.             url: '../detail/detail?id=' + id  
  23.         })  
  24.     }  
  25. },  
  26. //按下事件開始    
  27. mytouchstart: function (e) {  
  28.     let that = this;  
  29.     that.setData({  
  30.         touch_start: e.timeStamp  
  31.     })  
  32.     console.log(e.timeStamp + '- touch-start')  
  33. },  
  34. //按下事件結束    
  35. mytouchend: function (e) {  
  36.     let that = this;  
  37.     that.setData({  
  38.         touch_end: e.timeStamp  
  39.     })  
  40.     console.log(e.timeStamp + '- touch-end')  
  41. },  
  42.  

 

大云網官方微信售電那點事兒

責任編輯:售電衡衡

免責聲明:本文僅代表作者個人觀點,與本站無關。其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,并請自行核實相關內容。
我要收藏
個贊
?
主站蜘蛛池模板: 亚洲成a人在线观看 | 国产精品福利社 | 亚洲九九视频 | 亚洲综合日韩欧美一区二区三 | 国产高清在线观看视频手机版 | 国产成人刺激视频在线观看 | 日韩 欧美 自拍 | 成年女人黄小视频 | 日韩在线国产 | 中文字幕在线播放 | 日韩欧美一区二区久久 | 久久99欧美 | 久草在线观看福利 | 国产精品一区二区综合 | 欧美高清videossex19 | 成人欧美视频免费看黄黄 | 性欧美一级毛片欧美片 | 亚洲国产专区 | 久久久国产高清 | 蕾丝视频永久在线入口香蕉 | 性生i活一级一片 | 久草视频在线播放 | 99久久久免费精品免费 | 最新69成人精品毛片 | 国产成人精品曰本亚洲78 | 99热久久精品国产 | 日本精品1在线区 | 在线播放免费播放av片 | 日本在线视频免费看 | 狠狠色狠狠色综合久久一 | 521a久久九九久久精品 | 久久99精品视免费看 | 欧美视频二区 | 欧美性色网 | 国产精品成人观看视频网站 | 国产v综合v亚洲欧美大另类 | 成人网18免费视频 | 国产一级片免费看 | 国产下药迷倒白嫩丰满美女j8 | 欧美一级毛片久久精品 | 最近最新中文字幕免费的一页 |