瀏覽器的統一指針事件:Pointer Event
在早期的瀏覽器,輸入的事件其實相對單純,只有考慮到鼠標和鍵盤兩種;而當時的鼠標事件,其實就是 click、mousedown、mouseup 等等的事件。但是當手機、平板開始流行時候,再移動裝置上的主要操作界面,已經從鼠標變成是觸控了~
由於觸控和鼠標的操作邏輯,算是有根本上的差異的,再加上大部分的裝置又支持多點觸控,所以雖然瀏覽器大多會把觸控的事件對應回傳統的鼠標事件,但是如果希望能有更細致的操作,傳統的鼠標事件是不夠用的。
而目前 W3C 針對觸控操作的部分,則有兩種事件模型可以使用,其中一個是專門為了觸控設計的 Touch Event,這應該算是目前大部分移動瀏覽器所支持的事件架構;而另一種,則是由微軟所提出的、試圖統一所有指針裝置的事件架構、Pointer Event。
相較於目前主流的 Touch Event (W3C)只有去處理觸控的事件,微軟提出的 Pointer Event 則是希望能把所有的指針事件都統一來做管理、讓程序開發時能更簡單地使用。下圖就是官方的示意圖。
以目前定義的標準來說,Pointer Event (W3C)能支持的指針裝置包括了鼠標、觸控(手指)、以及筆型裝置;而除了能整合不同類型的指針裝置外,Pointer Event 針對能支持的硬件,也多了相當多額外的參數,像是壓力、寬度、高度,甚至比型裝置的傾斜程度等等。
這些更詳細的資訊,基本上都是可以讓開發者根據各種指針裝置的輸入,來做更細致的處理的~再加上透過 Pointer Event 的架構,可以一次性地處理掉鼠標和觸控等裝置的事件,所以在 Heresy 來看,應該算是一種相對好的架構。
跨瀏覽器
很遺憾的,目前基本上只有微軟自家的 Internet Explorer(10+)有原生支持 Pointer event(不過也不大一樣,請參考 MSDN),其他的瀏覽器,都僅支持 Touch Even;而再加上 IE 本身並不支持 Touch Event,所以變成要跨瀏覽器處理觸控事件,就得寫兩個版本了… 不過還好,微軟他們為了推動自己提出的 Pointer Event,所以也有提供一個讓其他瀏覽器也能支持 Pointer Event 的 JavaScript 函式庫、Hand.js!他的官方網站是:http://handjs.codeplex.com/ 基本上只要在網頁裡面引入這個 JavaScript 檔後,Firefox 或 Chrome 也就都可以使用 Pointer Event 了~ 詳細的介紹則可以參考《Hand.js: a polyfill for supporting pointer events on every browser》。事件的定義
- pointerdown
- pointerup
- pointercancel
- pointermove
- pointerover
- pointerout
- pointerenter
- pointerleave
interface PointerEvent : MouseEvent { readonly attribute long pointerId; readonly attribute long width; readonly attribute long height; readonly attribute float pressure; readonly attribute long tiltX; readonly attribute long tiltY; readonly attribute DOMString pointerType; readonly attribute boolean isPrimary; };
其中,每一個指針都有屬於自己的編號、也就是 pointerId;而透過 pointerType 則可以判斷他是哪一種類型的指針,目前的標準包含了 mouse、pen、touch 這三種可能。
而要取得指針的位置的時候,則是可以視需要使用 screenX /screenY,或是 clientX / clientY。
其他像是 width、height,就是代表這個指針的大小(應該是給觸控用的),pressure 則是指針裝置的壓力(介於 0-1 之間),而 tileX 和 tileY 則是筆型裝置的傾斜程度。
使用的話,由於 自己也是剛開始玩,所以這邊就不自己寫範例了。
在微軟官方的博客文章《Hand.js: a polyfill for supporting pointer events on every browser》和《Unifying touch and mouse: how Pointer Events will make cross-browsers touch support easy》內,就有展示、以及使用範例了~有興趣寫的話,應該是參考這邊就可以了。另外,它裡面也有提供一個範例網頁(連結),可以做進一步的參考。
而在《Creating an universal virtual touch joystick working for all Touch models thanks to Hand.JS》一文中,也有展示如何使用 Pointer Event 來做一個觸控的搖桿遊戲,應該也算是值得參考的實作。 附註:
- Windows 版的 FireFox 預設應該是把觸控事件關閉的,需要手動開啟,否則就算是在平板上用觸控也只會抓到鼠標事件。他的開啟方法是在 FireFox 打開「about:config」的頁面,找到「dom.w3c_touch_events.enabled」這個項目,把他的值從「0」改成「1」。
- MouseEvent 的定義(DOM Level 3、參考):
interface MouseEvent : UIEvent { readonly attribute long screenX; readonly attribute long screenY; readonly attribute long clientX; readonly attribute long clientY; readonly attribute boolean ctrlKey; readonly attribute boolean shiftKey; readonly attribute boolean altKey; readonly attribute boolean metaKey; readonly attribute unsigned short button; readonly attribute unsigned short buttons; readonly attribute EventTarget? relatedTarget; };
參考:
- Pointer Events @ W3C
- Touch Events @ W3C
- Hand.js: a polyfill for supporting pointer events on every browser
- Creating an universal virtual touch joystick working for all Touch models thanks to Hand.JS
- 移動瀏覽器的 HTML5 功能支持表:http://mobilehtml5.org/
轉自:http://www.iefans.net/zhizhen-shijian-pointer-event/
瀏覽器的統一指針事件:Pointer Event