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

移動端js觸控事件

開發者工具

在移動開發中,一種較為容易的做法是,先在桌面上開始原型設計,然後再在打算要支援的裝置上處理移動特有的部分。多點觸控正是難以在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。

一、手機上的觸控事件 基本事件: touchstart   //手指剛接觸螢幕時觸發 touchmove    //手指在螢幕上移動時觸發 touchend     //手指從螢幕上移開時觸發 下面這個比較少用: touchcancel  //觸控過程被系統取消時觸發 每個事件都有以下列表,比如touchend的targetTouches當然是 0 咯: touches         //位於螢幕上的所有手指的列表 targetTouches   //位於該元素上的所有手指的列表 changedTouches  //涉及當前事件的所有手指的列表 每個事件有列表,每個列表還有以下屬性: 複製程式碼 其中座標常用pageX,pageY: pageX    //相對於頁面的 X 座標 pageY    //相對於頁面的 Y 座標 clientX  //相對於視區的 X 座標 clientY  //相對於視區的 Y 座標 screenX  //相對於螢幕的 X 座標 screenY  //相對於螢幕的 Y 座標 identifier // 當前觸控點的惟一編號 target   //手指所觸控的 DOM 元素 複製程式碼 其他相關事件: event.preventDefault()   //阻止觸控時瀏覽器的縮放、滾動條滾動 var supportTouch = "createTouch" in document  //判斷是否支援觸控事件 更多深入內容?點選:http://www.cesclub.com/bw/jishuzhongxin/Webjishu/2011/1216/18069.html 二、示例 以下是獲取不同型別滑動的程式碼具體做法,結合前人的思想,封裝好了,可以借鑑學習: 複製程式碼 var touchFunc = function(obj,type,func) {     //滑動範圍在5x5內則做點選處理,s是開始,e是結束     var init = {x:5,y:5,sx:0,sy:0,ex:0,ey:0};     var sTime = 0, eTime = 0;     type = type.toLowerCase();     obj.addEventListener("touchstart",function(){         sTime = new Date().getTime();         init.sx = event.targetTouches[0].pageX;         init.sy = event.targetTouches[0].pageY;         init.ex = init.sx;         init.ey = init.sy;         if(type.indexOf("start") != -1) func();     }, false);     obj.addEventListener("touchmove",function() {         event.preventDefault();//阻止觸控時瀏覽器的縮放、滾動條滾動         init.ex = event.targetTouches[0].pageX;         init.ey = event.targetTouches[0].pageY;         if(type.indexOf("move")!=-1) func();     }, false);     obj.addEventListener("touchend",function() {         var changeX = init.sx - init.ex;         var changeY = init.sy - init.ey;         if(Math.abs(changeX)>Math.abs(changeY)&&Math.abs(changeY)>init.y) {             //左右事件             if(changeX > 0) {                 if(type.indexOf("left")!=-1) func();             }else{                 if(type.indexOf("right")!=-1) func();             }         }         else if(Math.abs(changeY)>Math.abs(changeX)&&Math.abs(changeX)>init.x){             //上下事件             if(changeY > 0) {                 if(type.indexOf("top")!=-1) func();             }else{                 if(type.indexOf("down")!=-1) func();             }         }         else if(Math.abs(changeX)<init.x && Math.abs(changeY)<init.y){             eTime = new Date().getTime();             //點選事件,此處根據時間差細分下             if((eTime - sTime) > 300) {                 if(type.indexOf("long")!=-1) func(); //長按             }             else {                 if(type.indexOf("click")!=-1) func(); //當點選處理             }         }         if(type.indexOf("end")!=-1) func();     }, false); };

手機觸控式螢幕的JS事件

 (2013-04-02 17:37:03) 轉載
標籤: 

js

 

it

分類: JS
處理Touch事件能讓你跟蹤使用者的每一根手指的位置。你可以繫結以下四種Touch事件:     1.touchstart:  // 手指放到螢幕上的時候觸發      2.touchmove:  // 手指在螢幕上移動的時候觸發      3.touchend:  // 手指從螢幕上拿起的時候觸發      4touchcancel:  // 系統取消touch事件的時候觸發。至於系統什麼時候會取消,不詳 屬性     1.client / clientY:// 觸控點相對於瀏覽器視窗viewport的位置      2.pageX / pageY:// 觸控點相對於頁面的位置      3.screenX /screenY:// 觸控點相對於螢幕的位置      4.identifier: // touch物件的unique ID  //touchstart事件   function touchSatrtFunc(e) {       //evt.preventDefault(); //阻止觸控時瀏覽器的縮放、滾動條滾動等       var touch = e.touches[0]; //獲取第一個觸點       var x = Number(touch.pageX); //頁面觸點X座標       var y = Number(touch.pageY); //頁面觸點Y座標       //記錄觸點初始位置       startX = x;       startY = y;   }   //touchmove事件  function touchMoveFunc(e) {       //evt.preventDefault(); //阻止觸控時瀏覽器的縮放、滾動條滾動等       var touch = evt.touches[0]; //獲取第一個觸點       var x = Number(touch.pageX); //頁面觸點X座標       var y = Number(touch.pageY); //頁面觸點Y座標       var text = 'TouchMove事件觸發:(' + x + ', ' + y + ')';       //判斷滑動方向       if (x - startX != 0) {           //左右滑動       }       if (y - startY != 0) {           //上下滑動       }   }  

Mobile Web前端開發系列: 事件處理(二)

 (2012-08-07 15:16:42) 轉載

上篇文章我們講了html的基本事件,這篇文章我們著重講解下觸控事件,觸控事件觸發的條件是手指接觸螢幕、手指在螢幕上移動或者從螢幕上離開。 事件是觸控的集合,它起始於手指初次放置在螢幕上,終止於最後一個手指離開螢幕。事件從開始到結束過程中的所有觸控操作都儲存在相同事件的記錄中。

touch事件

touch事件可以分為單點觸控和多點觸控兩種,單點觸控高階機一般都支援,Safari2.0、Android3.0以上的版本支援多點觸控,支援最多5個手指同時觸控式螢幕幕,ipad最多支援11個手指同時觸控式螢幕幕, 我們可以採用以下的事件模型捕獲這些事件,

ontouchstart ontouchmove ontouchend ontouchcancel

當用戶按下手指在螢幕上,ontouchstart會被觸發,當用戶移動一個或多個手指的時候,ontouchmove會被觸發,當用戶移走手指, ontouchend被觸發。那什麼時候觸發ontouchcancel呢?當一些更高級別的事件發生的時候,例如,alert,有電話打來或者有 推送的訊息提示的時候會取消當前的touch操作,即觸發ontouchcancel。當你在開發一個web game的時候,ontouchcancel 對你很重要,你可以在ontouchcancel觸發的時候暫停遊戲或者儲存遊戲。

gesture事件

gesture事件的執行原理與touch事件相同,只是gesture事件僅當螢幕上存在至少兩個手指時觸發,所以Safari2.0、Android3.0以上版本支援, 手勢具備諸多優勢,可以幫助我們測量兩指放縮和旋轉操作,事件模型如下,

ongesturestart ongesturechange ongestureend

事件屬性

無論使用觸控還是手勢事件,你都需要將這些事件轉換為單獨的觸控來使用它們。為此,你需要訪問事件物件的一系列的屬性。

targetTouches 目標元素的所有當前觸控 changedTouches 頁面上最新更改的所有觸控 touches 頁面上的所有觸控

changedTouches、targetTouches和touches分別包含稍微不同的觸控列表。targetTouches和touches分別包含當前位於 螢幕上的手指列表,但changedTouches僅列出最後發生的觸控。如果你在使用touchend或者gestureend事件,那麼這個屬性 非常重要。在這兩種情況下,螢幕上都不會再出現手指,因此targetTouches和touches應該為空,但你仍然可以通過檢視 changedTouches陣列來了解最後發生的事情。

由於觸控屬性都會生成陣列,因此你可以使用JavaScript陣列函式來訪問它們。這意味著,event.touches[0]將返回第一次 觸控,並且可以使用event.touches.length來計算當前儲存的觸控數量。

檢視單獨觸控時,通過使用event.targetTouches[0],你也可以訪問其它觸控,每個觸控會包含一些具體資訊,

clientX、clientY 相對於當前螢幕的X或Y位置 pageX、pageY 相對於整體頁面的X或Y位置 screenX、screenY 相對於使用者計算機螢幕的X或Y位置 identifier 事件的唯一識別符號 target 生成觸控的目標物件

手勢事件的事件物件會比普通觸控事件多兩個屬性,

rotation 手指的旋轉角度 scale 放縮的值

JavaScript觸控與手勢事件

 2012-12-10  

iOS版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集合。

這些事件會在文件的所有元素上面觸發,因而可以分別操作頁面的不同部分。在觸控式螢幕幕上的元素時,這些事件發生的數序如下:

  1. touchstart
  2. mouseover
  3. mousemove
  4. mousedown
  5. mouseup
  6. click
  7. 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);

與前面演示觸控事件的例子一樣,這裡的程式碼只是將每個事件都關聯到同一個函式中,然後通過該函式輸出每個事件的相關資訊。