js中的touch事件及gesture(手勢)事件詳解 — 第13.4.9節

一:touch事件分類?
1. touchstart:當手指觸摸屏幕時觸發。不管有多少個手指放在了屏幕上,只要再觸摸一下屏幕就會觸發。在此,我用小米的google瀏覽器做了一個實驗,添加一個計數器,用來查看屏幕上手指觸摸的次數,代碼如下:

    window.onload = function(){
        var i = 0;
        document.addEventListener('touchstart',function(event){
            myDiv.innerHTML = '觸屏的次數:'+ i++;
        },false)
    }

2.touchmove:當手指在屏幕上滑動的時候觸發該是事件,在這期間可以通過event.preventDefault()來阻止滾動;
3.touchend:手指從屏幕中移開的時候觸發;
4.touchcancel:當系統停止跟蹤觸摸時觸發。(不做說明)
例如我們在手機屏幕上利用前面三個事件來獲取手指的位置,壓力,接觸面的值:效果如下:
這裏寫圖片描述
html和css代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,height=device-height, user-scalable=no,initial-scale=1, minimum-scale=1, maximum-scale=1 ">
    <title>Document</title>
    <style>
        #myDiv{width:200px;height:200px;margin: 0 auto;}
        #myDiv2{width:40px;height: 40px;border-radius: 20px; background-color:deeppink;position: absolute;top:0;left:0;z-index:0}
    </style>
</head>
<body>
    <div id="myDivStart">Touch start(0, 0)</div>
    <div id="myDivmove">Touch move(0, 0)</div>
    <div id="myDivend">Touch end(0, 0)</div>
    <div id="myradius">Touch radius(0, 0)</div>
    <div id="force">Touch force:</div>
    <div id="rotateAngle">Touch rotationAngle:</div>
    <div id="myDiv2"></div>
</body>
</html>

js代碼:

        function touchEvent(event){
        event = event || window.event;
        var mydiv2 = document.getElementById('myDiv2');
        var myDivStart = document.getElementById('myDivStart');
        var myDivmove = document.getElementById('myDivmove');
        var myDivend = document.getElementById('myDivend');
        var myradius = document.getElementById('myradius');
        var force = document.getElementById('force');
        var rotationAngle = document.getElementById('rotateAngle');
        var coordinateX = event.changedTouches[0].clientX;
        var coordinateY = event.changedTouches[0].clientY;  

        mydiv2.style.left = parseFloat(coordinateX)-20 + 'px';  
        mydiv2.style.top = parseFloat(coordinateY)-20 + 'px';
        myradius.innerHTML = "Touch radius:(" + event.changedTouches[0].radiusX.toFixed(2) + ' ,' + event.changedTouches[0].radiusY.toFixed(2) + ")";
        rotationAngle.innerHTML = "Touch rotationAngle:" + event.changedTouches[0].rotationAngle;
        force.innerHTML = "Touch force:" + event.changedTouches[0].force.toFixed(3);
        var intX = parseInt(coordinateX);
        var intY = parseInt(coordinateY);
        switch(event.type){
            case "touchstart" :
                myDivStart.innerHTML = "Touch started:(" + event.touches[0].clientX.toFixed(2) + ' ,' + event.touches[0].clientY.toFixed(2) + ")";
                console.log(event);
                break;
            case "touchmove" :
                event.preventDefault();//   阻止滾動
                myDivmove.innerHTML = "Touch moved:(" + intX + ' ,' + intY + ")";
                console.log(event);
                break;
            case "touchend" :
                myDivend.innerHTML = "Touch end:(" + intX + ' ,' + intY + ")";
                console.log(event);
                myradius.innerHTML = "Touch radius:(0.00,0.00)"
                force.innerHTML = "Touch force:0.00" ;
                break;
        }
    }
    document.addEventListener("touchstart",touchEvent,false);
    document.addEventListener("touchmove",touchEvent,false);
    document.addEventListener("touchend",touchEvent,false);

二:touch事件對應的event對象有哪些?
  根據上面的代碼,可以得到,當觸發touch事件的時候,會生成一個TouchEvent對象,如下圖:
這裏寫圖片描述
常見的有上面劃線三種屬性,在做一些效果的時候,也是用以下的三個屬性中的touchList對象來確定元素的所有信息。
1.touches:表示當前跟蹤的觸摸操作的touch對象的屬性;
2.targetTouches:表示特定事件目標的Touch對象的數組。
3.changeTouches:表示從上一次觸摸以來,發生了改變的touch對象的數組。
  以上這些屬性都是一個包含名爲TouchList的對象,當觸發點爲1(即:event.touches.length ===event.targetTouches.lengh ===event.changeTouches.length)的時候,它們包含觸摸點的所有信息,但是這時候雖然包含信息一樣,但是執行(event.targetTouches == event.touches)返回值爲false,那就是說,裏面肯定有一些地方不相同,暫時還沒有找到,如下圖所示:
這裏寫圖片描述
下面是一些被觸摸位置的一些重要屬性:

  • clientX和clientY屬性:相對於視口的座標;
  • identifier:標識觸摸的唯一id;
  • pageX和pageY:相對於頁面的座標;
  • screenX和screenY:相對於屏幕的座標;
  • radiusX和radiusY:能夠包圍用戶和觸摸平面的接觸面的最小橢圓的水平軸(X軸)半徑和垂直軸(Y軸)半徑;
  • rotationAngle :這個屬性和 Touch.radiusX , Touch.radiusY一起, 描述了用戶和觸摸平面的接觸面.
  • force:返回這個 Touch 對象對應的手指擠壓觸摸平面的壓力大小, 從0.0(沒有壓力)到1.0(最大壓力)的浮點數.
  • target:觸摸的DOM節點目標。
    注意:在touchend事件發生時,touches屬性和targetTouches屬性中的touchList對象就沒有任何東西了,所以,這時候要想取得觸發點的信息,就必須使用changeTouches屬性。
    三:touch、mouse和click事件觸發順序?
      touch事件和click事件觸發順序:
    1.touchstart事件;
    2.mouseover事件;
    3.mousemove事件(一次);
    4.mousedown事件;
    5.mouseup事件;
    6.click事件;
    7.touchend事件。
    兼容性:iOS版的Safari、Android版的webkit、bada版的Dolfin、OS6中的BlackBerry webkit、Opera中的Mobile10.1 和 LG專有的PHantom瀏覽器。但是隻有IOS的Safari支持多點觸摸。桌面版本的Firefox6+和Chrome也支持觸摸。
    四:iOS2.0中的手勢事件:gesture事件
      注意:下面的事件只能在iOS中運行。在iOS中檔兩個手指操作的時候,就會產生手勢,手勢通常用於改變顯示元素的大小,或者旋轉顯示的元素。手勢事件分爲三種:
    1.gesturestart:當一個手指已經按在屏幕上,另一個手指又觸摸屏幕的時候觸發。類似於touchstart的作用一樣;
    2.gesturechange:當觸摸屏幕的任何一個手指的位置發生變化的時候觸發。
    3.gestureend:當任何一個手指從屏幕上面移開時觸發。
    下面這些代碼在安卓上不能用,只有在iOS上可以使用:
    var mydiv = document.getElementById('myDiv');
    function gesture(event){
        console.log(event)
        switch(event.type){
            case "gesturestart" : 
                mydiv.innerHTML = "gesture start (rotation=" + event.rotation + ',scale=' + event.scale + ')';
                break;
            case "gesturechange" :
                mydiv.innerHTML = "gesture change (rotation=" + event.rotation + ',scale=' + event.scale + ')';
                break;
            case "gestureend" :
                mydiv.innerHTML = "gesture end (rotation=" + event.rotation + ',scale' + event.scale + ')';
                break;
        }
    }
    document.addEventListener('gesturestart',gesture,false);
    document.addEventListener('gesturechange',gesture,false);
    document.addEventListener('gestureend',gesture,false);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章