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

責(zé)任編輯:售電衡衡
-
權(quán)威發(fā)布 | 新能源汽車(chē)產(chǎn)業(yè)頂層設(shè)計(jì)落地:鼓勵(lì)“光儲(chǔ)充放”,有序推進(jìn)氫燃料供給體系建設(shè)
2020-11-03新能源,汽車(chē),產(chǎn)業(yè),設(shè)計(jì) -
中國(guó)自主研制的“人造太陽(yáng)”重力支撐設(shè)備正式啟運(yùn)
2020-09-14核聚變,ITER,核電 -
探索 | 既耗能又可供能的數(shù)據(jù)中心 打造融合型綜合能源系統(tǒng)
2020-06-16綜合能源服務(wù),新能源消納,能源互聯(lián)網(wǎng)
-
新基建助推 數(shù)據(jù)中心建設(shè)將迎爆發(fā)期
2020-06-16數(shù)據(jù)中心,能源互聯(lián)網(wǎng),電力新基建 -
泛在電力物聯(lián)網(wǎng)建設(shè)下看電網(wǎng)企業(yè)數(shù)據(jù)變現(xiàn)之路
2019-11-12泛在電力物聯(lián)網(wǎng) -
泛在電力物聯(lián)網(wǎng)建設(shè)典型實(shí)踐案例
2019-10-15泛在電力物聯(lián)網(wǎng)案例
-
新基建之充電樁“火”了 想進(jìn)這個(gè)行業(yè)要“心里有底”
2020-06-16充電樁,充電基礎(chǔ)設(shè)施,電力新基建 -
燃料電池汽車(chē)駛?cè)雽こ0傩占疫€要多久?
-
備戰(zhàn)全面電動(dòng)化 多部委及央企“定調(diào)”充電樁配套節(jié)奏
-
權(quán)威發(fā)布 | 新能源汽車(chē)產(chǎn)業(yè)頂層設(shè)計(jì)落地:鼓勵(lì)“光儲(chǔ)充放”,有序推進(jìn)氫燃料供給體系建設(shè)
2020-11-03新能源,汽車(chē),產(chǎn)業(yè),設(shè)計(jì) -
中國(guó)自主研制的“人造太陽(yáng)”重力支撐設(shè)備正式啟運(yùn)
2020-09-14核聚變,ITER,核電 -
能源革命和電改政策紅利將長(zhǎng)期助力儲(chǔ)能行業(yè)發(fā)展
-
探索 | 既耗能又可供能的數(shù)據(jù)中心 打造融合型綜合能源系統(tǒng)
2020-06-16綜合能源服務(wù),新能源消納,能源互聯(lián)網(wǎng) -
5G新基建助力智能電網(wǎng)發(fā)展
2020-06-125G,智能電網(wǎng),配電網(wǎng) -
從智能電網(wǎng)到智能城市
-
山西省首座電力與通信共享電力鐵塔試點(diǎn)成功
-
中國(guó)電建公司公共資源交易服務(wù)平臺(tái)摘得電力創(chuàng)新大獎(jiǎng)
-
電力系統(tǒng)對(duì)UPS的技術(shù)要求