javascript移動端Touch事件的使用方法-創(chuàng)新互聯(lián)

隨著智能手機和平板電腦的普及, 越來越多的人用移動設(shè)備瀏覽網(wǎng)頁,我們平時在pc瀏覽器上用的鼠標事件,比如:click, mouseover等, 已經(jīng)無法滿足移動設(shè)備觸摸屏的特點,觸摸時代的到來,離不開那些觸摸事件。

成都創(chuàng)新互聯(lián)公司于2013年成立,先為龍崗等服務(wù)建站,龍崗等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為龍崗企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

觸摸事件包含4個接口。

TouchEvent

代表當觸摸行為在平面上變化的時候發(fā)生的事件.

Touch

代表用戶手指與觸摸平面間的一個接觸點.

TouchList

代表一系列的Touch; 一般在用戶多個手指同時接觸觸控平面時使用這個接口.

DocumentTouch

包含了一些創(chuàng)建 Touch對象與TouchList對象的便捷方法.

(參考于 https://developer.mozilla.org/zh-CN/docs/Web/API/Touch_events

TouchEvent接口可以響應(yīng)基本觸摸事件(如單個手指點擊),它包含了一些具體的事件,

事件類型:

touchstart : 觸摸開始(手指放在觸摸屏上)

touchmove : 拖動(手指在觸摸屏上移動)

touchend : 觸摸結(jié)束(手指從觸摸屏上移開)

touchenter :移動的手指進入一個dom元素。

touchleave :移動的手指離開一個dom元素。

還有一個touchcancel,是在拖動中斷時候觸發(fā)。

事件屬性:

altKey : 該屬性返回一個布爾值,表示在指定的事件發(fā)生時,Alt 鍵是否處于按下狀態(tài), event.altKey=true|false|1|0

type : 觸摸時觸發(fā)的事件類型,比如touchstart

每個觸摸事件都包括了三個觸摸屬性列表:

1. touches:當前位于屏幕上的所有手指觸摸點的一個列表。

2. targetTouches:當前元素對象上所有觸摸點的列表。

3. changedTouches:涉及當前事件的觸摸點的列表。

它們都是一個數(shù)組,每個元素代表一個觸摸點。

每個觸摸點對應(yīng)的Touch都有三對重要的屬性,clientX/clientY、pageX/pageY、screenX/screenY。

其中screenX/screenY代表事件發(fā)生的位置對于屏幕的偏移量,clientX/clienYt和pageX/pageY都代表事件發(fā)生位置對應(yīng)對象的偏移量,不過區(qū)別是clientX/clientY不包括對象滾動而隱藏的偏移量,而pageX/pageY包括對象滾動而隱藏的偏移量。移開屏幕的那個觸摸點,只會包含在changedTouches列表中,而不會包含在touches 和targetTouches 列表中, 所以changedTouches在項目當中會比較常用。

示例:

<body onload="start();">
<style type="text/css">
#dom {
  width:500px;
  height:500px;
  background:black;
}
</style>
<div id="dom"></div>
<script type="text/javascript">
function onTouchStart(e){
    console.log(e);
}
function start(){
    var dom = document.getElementById('dom');
    dom.addEventListener('touchstart', onTouchStart, false);
}
</script>
</body>

控制臺輸出如下:

javascript移動端Touch事件的使用方法

觸摸事件跟鼠標事件的觸發(fā)先后順序:

Touchstart > toucheend > mousemove > mousedown > mouseup > click

很多情況下觸摸事件跟鼠標事件會同時觸發(fā)(目的是為了讓沒有對觸摸設(shè)備優(yōu)化的代碼仍然可以在觸摸設(shè)備上正常工作),如果使用了觸摸事件,可以調(diào)用event.preventDefault()來阻止鼠標事件被觸發(fā)。而手指在屏幕上移動touchmove則不會觸發(fā)鼠標事件和單擊事件,在touchmove事件中加入preventDefault, 可以禁止瀏覽器滾動屏幕,也不會影響單擊事件的觸發(fā)。

javascript移動端Touch事件的使用方法

以上事件,都系統(tǒng)內(nèi)置的,可以直接使用,通過這些內(nèi)置事件,可以組合成很多非原生的多點觸摸手勢touch手勢。

Hammer.js是一個輕量級的JavaScript庫, 能讓你的網(wǎng)站輕松實現(xiàn)觸控事件, 它依賴于jQuery,用來控制觸摸設(shè)備上的多點觸控特性。

官網(wǎng): http://hammerjs.github.io/

多點觸摸的實現(xiàn),想了解更多可以參考: http://www.cnblogs.com/iamlilinfeng/p/4239957.htm

zepto是輕量級兼容juqery的庫,適用于移動端開發(fā), 具體使用方法,可參看官網(wǎng), http://zeptojs.com/

zepto touch 是用于單點手勢觸發(fā)的一個touch事件模塊。

Touch.js 下載地址: https://github.com/madrobby/zepto/blob/master/src/touch.js

先看zepto的touch模塊實現(xiàn):

 $(document)
     .on('touchstart ...',function(e){
              ...
             ...
              now = Date.now()
             delta = now - (touch.last || now)
              if (delta > 0 && delta <= 250) touch.isDoubleTap = true
              touch.last = now
     })
     .on('touchmove ...', function(e){
     })
     .on('touchend ...', function(e){
            ...
            if (deltaX < 30 && deltaY < 30) {
                   var event = $.Event('tap')
                 
                   touch.el.trigger(event)
            }
     })

touch 模塊綁定事件 touchstart, touchmove, touchend 到 document上,然后通過計算事件觸發(fā)的時間差,位置差來實現(xiàn)自定義的tap,swipe事件。

手機上也有click事件,從觸摸到響應(yīng)click事件,有會300的毫秒的延遲,原因在于:

"Apple 準備發(fā)布iphone的時候,為了解決手機上web頁面太小的問題,增加了雙擊屏幕放大的功能,(double tap to zoom ),當用戶觸摸屏幕的時候,瀏覽器不知道用戶是要double tap還是要click,所以瀏覽器在第一次tap事件后會等300ms來判斷到底是double tap還是click ,如果在300ms以內(nèi)點擊的話,會以為是double tap,反之是click。"

去掉click事件 300ms 的方法:

(1)  在meta里,加 user-scalable=no 可以阻止雙擊放大,(缺點: 部分瀏覽器支持)

(2)  使用fastclick.js  它利用多touchstart touchmove 等原生事件的封裝,來實現(xiàn)手機上的各種手勢,比如tap, swipe 等,

調(diào)用很簡單:

$(function() {
    FastClick.attach(document.body);
});

缺點: 文件量有點大,為了解決一小延遲的問題,有點得不償失。

自定義事件

 // 創(chuàng)建事件對象
  var obj = new Event('sina');
  var elem = document.getElementById('dom');
  //監(jiān)聽sina事件
  elem.addEventListener('sina', function(e){
    console.log(e);
  },false);
  //分發(fā)sina事件
  elem.dispatchEvent(obj);

另外一個創(chuàng)建事件對象的方法是通過CustomEvent,相比于Event的好處是,它可以給處理事件的函數(shù),自定義detail值,這在實際開發(fā)中,可能會經(jīng)常用到。

  // 創(chuàng)建事件對象
  var obj = new window.CustomEvent('sina', {
      detail: {'name': 'lily'}
  });
  var elem = document.getElementById('dom');
  //監(jiān)聽sina事件
  elem.addEventListener('sina', function(e){
    // 可以接收到創(chuàng)建事件時,傳入的detail值。
    console.log(e. detail);  // {'name': 'lily'}
  },false);
  //分發(fā)sina事件
  elem.dispatchEvent(obj);

創(chuàng)建自定義事件,一個兼容性較好的函數(shù):

javascript移動端Touch事件的使用方法

zepto tap “點透”問題

Zepto 的tap事件是通過document綁定了touchstart和touchend事件實現(xiàn),如果綁定tap方法的dom元素在tap方法觸發(fā)后會隱藏、而“隱藏后,它底下同一位置正好有一個dom元素綁定了click的事件, 而clic事件有300ms延遲,觸發(fā)click事件。則會出現(xiàn)“點透”現(xiàn)象。

解決方案:

1 fastclick.js

它的實際原理是在目標元素上綁定touchstart ,touchend事件,然后在touchend這個庫直接在touchend的時候就觸發(fā)了dom上的click事件而替換了本來的觸發(fā)時間,touch事件是綁定到了具體dom而不是document上,所以e.preventDefault是有效的,可以阻止冒泡,也可以阻止瀏覽器默認事件。

2、利用fastclick的事件原理, 直接寫一段, 采用 e.preventDefault();  阻止“默認行為”,將事件綁定到dom元素上,缺點在于不能使用事件代理。

elem.addEventListener(touchend, function(e){
  e.preventDefault()
},false);

3.  在事件捕獲階段,如果時間差,位置差,均小于指定的值,就阻止冒泡和默認click事件的觸發(fā)。

javascript移動端Touch事件的使用方法

4. 用戶點擊的時候“彈出”一個頂層DIV,屏蔽掉所有事件傳遞,然后定時自動隱藏, 這個方法比較巧妙。

以上就是JS 移動端的 Touch 事件使用的詳細內(nèi)容,更多請關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司其它相關(guān)文章!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)頁名稱:javascript移動端Touch事件的使用方法-創(chuàng)新互聯(lián)
分享路徑:http://muchs.cn/article38/cdijpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、軟件開發(fā)、自適應(yīng)網(wǎng)站搜索引擎優(yōu)化、網(wǎng)站收錄、網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)