首頁  >  文章  >  web前端  >  JS 行動端的 Touch 事件使用

JS 行動端的 Touch 事件使用

Guanhui
Guanhui轉載
2020-05-21 09:42:312735瀏覽

JS 行動端的 Touch 事件使用

隨著智慧型手機和平板電腦的普及, 越來越多的人用行動裝置瀏覽網頁,我們平常在pc瀏覽器上用的滑鼠事件,例如:click, mouseover等, 已經無法滿足行動裝置觸控螢幕的特點,觸控時代的到來,離不開那些觸控事件。

觸控事件包含4個介面。

TouchEvent

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

Touch

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

TouchList

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

DocumentTouch

包含了一些建立Touch物件與TouchList物件的便利方法.

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

TouchEvent介面可以回應基本觸控事件(如單一手指點擊),它包含了一些特定的事件, 

事件類型:

##touchstart : 觸控開始(手指放在觸控螢幕上)

touchmove : 拖曳(手指在觸控螢幕上移動)

touchend : 觸控結束(手指從觸控螢幕移開)

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

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

還有一個touchcancel,是在拖曳中斷時候觸發。

事件屬性:

altKey : 此屬性傳回布林值,表示在指定的事件發生時,Alt 鍵是否處於按下狀態, event.altKey=true|false|1| 0

type : 觸摸時觸發的事件類型,例如touchstart

每個觸控事件都包含了三個觸控屬性清單:

1. touches:目前位於螢幕上的所有手指觸摸點的一個清單。

2. targetTouches:目前元素物件上所有觸控點的清單。

3. changedTouches:涉及當前事件的觸控點的清單。

它們都是一個數組,每個元素代表一個觸控點。

每個觸控點對應的Touch都有三對重要的屬性,clientX/clientY、pageX/pageY、screenX/screenY。

其中screenX/screenY代表事件發生的位置對於螢幕的偏移量,clientX/clienYt和pageX/pageY都代表事件發生位置對應對象的偏移量,不過區別是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(&#39;dom&#39;);
    dom.addEventListener(&#39;touchstart&#39;, onTouchStart, false);
}
</script>
</body>

控制台輸出如下:

JS 行動端的 Touch 事件使用

 觸碰事件跟滑鼠事件的觸發先後順序:

Touchstart > toucheend > mousemove > mousedown > mouseup > click

很多情況下觸控事件跟滑鼠事件會同時觸發(目的是為了讓沒有對觸控設備優化的程式碼仍然可以在觸控裝置上正常運作),如果使用了觸控事件,可以呼叫event.preventDefault()來阻止滑鼠事件被觸發。而手指在螢幕上移動touchmove則不會觸發滑鼠事件和點擊事件,在touchmove事件中加入preventDefault, 可以禁止瀏覽器滾動螢幕,也不會影響點擊事件的觸發。

JS 行動端的 Touch 事件使用

以上事件,都係統內建的,可以直接使用,透過這些內建事件,可以組合成很多非原生的多點觸控手勢touch手勢。

 

Hammer.js是一個輕量級的JavaScript庫, 能讓你的網站輕鬆實現觸控事件, 它依賴於jQuery,用來控制觸控裝置上的多點觸控特性。

官網:

http://hammerjs.github.io/

#多點觸控的實現,想了解更多可以參考:

http://www.cnblogs.com/iamlilinfeng/p/4239957.htm 

 

 

zepto是輕量級相容juqery的函式庫,適用於行動裝置開發, 具體使用方法,可參考官網,

#http://zeptojs.com/

zepto touch 是用於單點手勢觸發的一個touch事件模組。

Touch.js 下載網址:

https://github.com/madrobby/zepto/blob/master/src/touch.js

#先看zepto的touch模組實作:

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

touch 模組綁定事件touchstart, touchmove, touchend 到document上,然後透過計算事件觸發的時間差,位置差來實現自定義的tap,swipe事件。

 手机上也有click事件,从触摸到响应click事件,有会300的毫秒的延迟,原因在于:

"Apple 准备发布iphone的时候,为了解决手机上web页面太小的问题,增加了双击屏幕放大的功能,(double tap to zoom ),当用户触摸屏幕的时候,浏览器不知道用户是要double tap还是要click,所以浏览器在第一次tap事件后会等300ms来判断到底是double tap还是click ,如果在300ms以内点击的话,会以为是double tap,反之是click。"

去掉click事件 300ms 的方法:

(1)  在meta里,加 user-scalable=no 可以阻止双击放大,(缺点: 部分浏览器支持)

(2)  使用fastclick.js  它利用多touchstart touchmove 等原生事件的封装,来实现手机上的各种手势,比如tap, swipe 等, 

下载地址 https://github.com/ftlabs/fastclick  

调用很简单:

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

缺点: 文件量有点大,为了解决一小延迟的问题,有点得不偿失。

 

 

自定义事件

 // 创建事件对象
  var obj = new Event(&#39;sina&#39;);
  var elem = document.getElementById(&#39;dom&#39;);
  //监听sina事件
  elem.addEventListener(&#39;sina&#39;, function(e){
    console.log(e);
  },false);
  //分发sina事件
  elem.dispatchEvent(obj);

另外一个创建事件对象的方法是通过CustomEvent,相比于Event的好处是,它可以给处理事件的函数,自定义detail值,这在实际开发中,可能会经常用到。

  // 创建事件对象
  var obj = new window.CustomEvent(&#39;sina&#39;, {
      detail: {&#39;name&#39;: &#39;lily&#39;}
  });
  var elem = document.getElementById(&#39;dom&#39;);
  //监听sina事件
  elem.addEventListener(&#39;sina&#39;, function(e){
    // 可以接收到创建事件时,传入的detail值。
    console.log(e. detail);  // {&#39;name&#39;: &#39;lily&#39;}
  },false);
  //分发sina事件
  elem.dispatchEvent(obj);

 

创建自定义事件,一个兼容性较好的函数:

JS 行動端的 Touch 事件使用

 

 

zepto tap “点透”问题

Zepto 的tap事件是通过document绑定了touchstart和touchend事件实现,如果绑定tap方法的dom元素在tap方法触发后会隐藏、而“隐藏后,它底下同一位置正好有一个dom元素绑定了click的事件, 而clic事件有300ms延迟,触发click事件。则会出现“点透”现象。 

解决方案:

1 fastclick.js

它的实际原理是在目标元素上绑定touchstart ,touchend事件,然后在touchend这个库直接在touchend的时候就触发了dom上的click事件而替换了本来的触发时间,touch事件是绑定到了具体dom而不是document上,所以e.preventDefault是有效的,可以阻止冒泡,也可以阻止浏览器默认事件。

http://www.cnblogs.com/yexiaochai/p/3442220.html

2、利用fastclick的事件原理, 直接写一段, 采用 e.preventDefault();  阻止“默认行为”,将事件绑定到dom元素上,缺点在于不能使用事件代理。

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

3.  在事件捕获阶段,如果时间差,位置差,均小于指定的值,就阻止冒泡和默认click事件的触发。

JS 行動端的 Touch 事件使用

4. 用户点击的时候“弹出”一个顶层DIV,屏蔽掉所有事件传递,然后定时自动隐藏, 这个方法比较巧妙。

推荐教程:《PHP教程

以上是JS 行動端的 Touch 事件使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除