觸摸屏上(手機web,平板web)的javascript事件——開發者工具
開發者工具
在移動開發中,一種較爲容易的做法是,先在桌面上開始原型設計,然後再在打算要支持的設備上處理移動特有的部分。多點觸摸正是難以在PC上進行測試的那些功能之一,因爲大部分的PC都沒有觸摸輸入。
不得不在移動設備上進行的測試有可能會拉長你的開發週期,因爲你所做的每項改變都需要提交代碼到服務器上,接着再加載到設備上。然後,一旦運行後,對應用也就沒有太多的調試了,因爲平板電腦和智能手機都很缺乏web開發者所用的工具。
這個問題的一個解決方案是在開發機器上模擬觸發事件。對於單點觸摸,觸摸事件可以基於鼠標事件來模擬。如果你有觸摸輸入設備的話,比如說現代的App MacBook,那麼多點觸摸也可以被模擬。
單點觸摸事件
如果你想在桌面上模擬單點觸摸事件的話,試一下Phantom Limb,該程序在網頁上模擬觸摸事件並提供一隻巨手來引導。
另外還有Touchable這一jQuery插件,該插件跨平臺地統一了觸摸和鼠標事件。
多點觸摸事件
爲了能夠讓你的多點觸摸web應用在你的瀏覽器或是多點觸摸控板(比如說Apple MacBook或是MagicPad)上起作用,我創建了這一個MagicTouch.js填充工具,其捕捉來自觸控板的觸摸事件,然後把它們轉換成標準兼容的觸摸事件。
1. 下載npTuioClient NPAPI插件並把它安裝到~/Library/Internet Plug-Ins/目錄下。
2. 下載這一Mac MagicPad的TongSeng TUIO應用並啓動這一服務器。
3. 下載MagicTouch.js這一JavaScript庫來基於npTuioClient回調模擬規範兼容的觸摸事件。
4. 以如下方式把magictouch.js腳本和npTuioClient插件包含到你的應用中:
< head>
...
< script src="/path/to/magictouch.js" kesrc="/path/to/magictouch.js">< /script>
< /head>
< body>
...
< object id="tuio" type="application/x-tuio" style="width: 0px; height: 0px;">
Touch input plugin failed to load!
< /object>
< /body>
我只在Chrome 10上測試了這一方法,不過只要稍做調整它應該能夠在其他的現代瀏覽器上工作。
如果你的計算機沒有多點觸摸輸入的話,你可以使用其他的TUIO跟蹤器,比如說reacTIVision來模擬觸摸事件。欲瞭解更多信息,請參閱TUIO項目頁面。
需要注意的一點是,你的手勢可以是和OS層面的多點觸摸手勢相同的。在OS X上,你可以通過進入System Preferences中的Trackpad偏好設定版面來配置系統範圍的事件。
隨着多點觸摸功能逐漸得到跨移動瀏覽器的的廣泛支持,我非常高興地看到新的web應用充分利用了這一豐富的API。
-
原文來源:html5rocks.com
JavaScript觸摸與手勢事件
2012-12-10iOS版Safari爲了向開發人員傳達一些特殊信息,新增了一些專有事件。因爲iOS設備既沒有鼠標也沒有鍵盤,所以在爲移動Safari開發交互網頁時,常規的鼠標和鍵盤事件根本不夠用。隨着Android中的WebKit的加入,很多這樣的專有事件變成了事實標準。
1.觸摸事件
包含iOS2.0軟件的iPhone 3G發佈時,也包含了一個新版本的Safari瀏覽器。這款新的移動Safari提供了一些與觸摸(touch)操作相關的新事件。後來,Android上的瀏覽器也實現了相同的事件。觸摸事件會在用戶手指放在屏幕上面時、在屏幕上滑動時或從屏幕上移開時觸發。具體來說,有以下幾個觸摸事件。
- touchstart:當手指觸摸屏幕時觸發;即使已經有一個手指放在了屏幕上也會觸發。
- touchmove:當手指在屏幕上滑動時連續的觸發。在這個事件發生期間,調用preventDefault()可阻止滾動。
- touchend:當手指從屏幕上移開時觸發。
- touchcancel:當系統停止跟蹤觸摸時觸發。關於此事件的確切觸發事件,文檔中沒有明確說明。
上面這幾個事件都會冒泡,也都可以取消。雖然這些觸摸事件沒有在DOM規範中定義,但它們卻是以兼容DOM的方式實現的。因此,每個觸摸事件沒有在DOM規範中定義,但它們卻是以兼容DOM的方式實現的。因此,每個觸摸事件的event對象都提供了在鼠標事件中常見的屬性:bubbles、cancelable、view、clientX、clientY、screenX、screenY、detail、altKey、shiftKey、ctrlKey和metaKey。
除了常見的DOM屬性外,觸摸事件還包含下列三個用於跟蹤觸摸的屬性。
- touches:表示當前跟蹤的觸摸操作的Touch對象的數組。
- targetTouches:特定於事件目標的Touch對象的數組。
- changeTouches:表示自上次觸摸以來發生了什麼改變的Touch對象的數組。
每個Touch對象包含下列屬性。
- clientX:觸摸目標在視口中的X座標。
- clientY:觸摸目標在視口中的Y座標。
- identifier:表示觸摸的唯一ID。
- pageX:觸摸目標在頁面中的x座標。
- pageY:觸摸目標在頁面中的y座標。
- screenX:觸摸目標在屏幕中的x座標。
- screenY:觸摸目標在屏幕中的y座標。
- target:觸摸的DOM節點座標。
使用這些屬性可以跟蹤用戶對屏幕觸摸操作。來看下面的例子。
function handleTouchEvent(event) { //只跟蹤一次觸摸 if (event.touches.length == 1) { var output = document.getElementById("output"); switch (event.type) { case "touchstart": output.innerHTML = "Touch started (" + event.touches[0].clientX + "," + event.touches[0].clientY + ")"; break; case "touchend": output.innerHTML += "<br>Touch ended (" + event.changedTouches[0].clientX + "," + event.changeTouches[0].clientY + ")"; break; case "touchmove": event.preventDefault(); //阻止滾動 output.innerHTML += "<br>Touch moved (" + event.changedTouches[0].clientX + "," + event.changedTouches[0].clientY + ")"; break; } } } document.addEventListener("touchstart", handleTouchEvent, false); document.addEventListener("touchend", handleTouchEvent, false); document.addEventListener("touchmove", handleTouchEvent, false);
以上代碼會跟蹤屏幕上發生的一次觸摸操作。爲簡單起見,只會在有一次活動觸摸操作的情況下輸出信息。當touchstart事件發生時。會將觸摸的位置信息輸出到
元素中。當touchmove事件發生時,會取消其默認行爲,阻止滾動(觸摸移動的默認行爲是滾動頁面),然後輸出觸摸操作的變化信息。而touched事件則會輸出有關觸摸操作的最終信息。注意,在touched事件發生時,touched集合中就沒有任何Touch對象了,因爲不存在活動的觸摸操作;此時,就必須轉而使用changeTouchs集合。
這些事件會在文檔的所有元素上面觸發,因而可以分別操作頁面的不同部分。在觸摸屏幕上的元素時,這些事件發生的數序如下:
- touchstart
- mouseover
- mousemove
- mousedown
- mouseup
- click
- touchend
支持觸摸事件的瀏覽器包括iOS版Safari、Android版WebKit、beta版Dolfin、OS6+中的BlackBerry WebKit、Opera Mobile 10.1和LG專有OS中的phantom瀏覽器。目前只有IOS版Safari支持多點觸屏。桌面版Firefox 6+和Chrome也支持觸摸事件。
2.手勢事件
IOS 2.0中的Safari還引入了一組手勢事件。當兩個手指觸摸屏幕時就會產生手勢,手勢通常會改變顯示項的大小,或者旋轉顯示項。有三個手勢事件,分別如下。
- gesturestart:當一個手指已經按在屏幕上面另一個手指有觸摸屏幕時觸發。
- gesturechange:當觸摸屏幕的任何一個手指的位置發生變化時觸發。
- gestureend:當任何一個手指從屏幕上面移開時觸發。
只有兩個手指都觸摸到事件的接收容器時纔會觸發這些事件。在一個元素上設置事件處理程序,意味着兩個手指必須同時位於該元素的範圍之內,才能觸發手勢事件(這個元素就是目標)。由於這些事件冒泡,所以將事件處理程序放在文檔上也可以處理所有手勢事件。此時,事件的目標就是兩個手指都位於其範圍內的那個元素。
觸摸事件和手勢事件之間存在某種關係。當一個手指放在屏幕上時,會觸發touchstart事件。如果另一個手指又放在了屏幕上,則會先觸發gesturestart事件。如果另一個手指又放在了屏幕上,則會先觸發gesturestart事件,隨後觸發基於該手指的touchstart事件。如果一個或兩個手指在屏幕上滑動,將會觸發gesturechange事件,但只要有一個手指移開,就會觸發gestureend事件,緊接着又會觸發基於該手指的touchend事件。
與觸摸事件一樣,每個手勢事件的event對象都包含着標準的鼠標事件屬性:bubbles、cancelable、view、clientX、clientY、screenX、screenY、detail、altKey、shiftKey、ctrlKey和metaKey。此外,還包含兩個額外的屬性:rotation和scale。其中,rotation屬性表示手指變化引起的旋轉角度,負值表示逆時針旋轉,正值表示順時針旋轉(該值從0開始)。而scale屬性表示兩個手指間距的變化情況(例如向內收縮會縮短距離);這個值從1開始,並隨距離拉大而增長,隨距離縮減而減小。
下面是使用手勢事件的一個示例:
function handleGestureEvent(event) { var output = document.getElementById("output"); switch(event.type) { case "gesturestart": output.innerHTML = "Gesture started (rotation=" + event.ratation +",scale=" + event.scale + ")"; break; case "gestureend": output.innerHTML += "<br>Gesture ended (rotation+" + event.rotation + ",scale=" + event.scale + ")"; break; case "gesturechange": output.innerHTML += "<br>Gesture changed (rotation+=" + event.rotation + ",scale+" + event.scale + ")"; break; } } document.addEventListener("gesturestart", handleGestureEvent, false); document.addEventListener("gestureend", handleGestureEvent, false); document.addEventListener("gesturechange", handleGestureEvent, false);
與前面演示觸摸事件的例子一樣,這裏的代碼只是將每個事件都關聯到同一個函數中,然後通過該函數輸出每個事件的相關信息。