HTML5移動端觸控事件
阿新 • • 發佈:2019-01-01
一、移動端事件問題
1.click事件300ms延遲問題
2007年第一代iphone釋出,移動端Safari首創雙擊縮放功能,原理是click一次後,經過300ms之後檢測是否再有一次click,如果有就會縮放,如果沒有則是一個click事件。所以cilck操作會有卡頓感覺。
2.dblclick事件失效
由於雙擊縮放的存在,移動端的dblclick事件也失效了。
二、移動端觸控事件
- touchstart 在螢幕上按下手指時觸發
- touchmove 在螢幕上移動手指時觸發
- touchend 在螢幕上擡起手指時觸發
- touchcancel 觸點由於某些原因被中斷時觸發。例如觸控時電話接入或者彈出框,都會中斷觸控。一般會在這時暫停遊戲、存檔等操作。
三、TouchEvent事件物件
TouchEvent繼承了UIEvent和Event,事件物件中包含很多內容,這裡挑一些常用的:
touches 位於當前螢幕上所有觸控點列表(TouchList物件,包含若干個Touch物件) targetTouches 起始於當前DOM元素,且沒有結束的觸控點列表,是touches的一個嚴格子集(TouchList物件) changedTouches 當前事件發生變化的觸控點列表(TouchList物件).對於touchstart,新增加的觸點;對於touchmove,和上一次事件比較發生變化的觸點(任何一個屬性);對於touchend,離開螢幕的觸點。 target 觸發事件的DOM節點 type 當前事件的型別,如"touchstart" altKey 布林值,指明觸控事件觸發時,鍵盤 alt 鍵是否被按下。 ctrlKey 布林值,指明觸控事件觸發時,鍵盤 ctrl 鍵是否被按下。
每個觸控點(Touch物件)包含了如下屬性:
screenX / screenY 觸控點在螢幕中的位置 pageX / pageY 觸控點在整個文件中的位置 clientX / clientY 觸控點在可視區域中的位置 identifier 每個觸控點的唯一識別符號 target 該觸控點最開始觸控的dom元素,即觸發它的元素,無論觸點移動到了哪裡,該值都不會改變。 radiusX / radiusY 觸控點大概是一個橢圓,分別為水平軸半徑/垂直軸半徑(支援不好) rotationAngle 觸控點旋轉角度(順時針) force 壓力大小,從0.0(沒有壓力)到1.0(最大壓力)的浮點數
四、基於觸控事件的開發
以上的touch事件是HTML標準的內建事件,因為移動端的單雙擊事件問題和更豐富的使用者需求,僅僅依賴原生事件來開發是不夠方便的,因此出現了一些自定義事件的庫。比如jQuery Mobile庫和zeptojs庫中的tap類事件(用於代替click事件)和swipe類事件(定義滑動的事件)。我們還可以使用原生事件來自定義更高階的手勢,例如雙指放大縮小等。