1. 程式人生 > >HTML5移動端觸控事件

HTML5移動端觸控事件

一、移動端事件問題

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類事件(定義滑動的事件)。我們還可以使用原生事件來自定義更高階的手勢,例如雙指放大縮小等。