html 5移動端のクリックイベントtouch

43904 ワード

TOUCHイベント
   touch       ,     :touchstart、touchmove、touchend 。               ,                         。

    
touchstart:        DOM      。

 
touchmove:      DOM         。

 
touchend:      DOM         。

                   :

    
touches:                。

 
targetTouches:       DOM            。

 
changedTouches:              。

Touch   
                ,                ,              ,  :      。

TouchList {0: Touch, length: 1}
length:1
0:Touch
    clientX:65 //               
    clientY:18 //               
    force:1 //        
    identifier:0 //        (ID)
    pageX:65 //            
    pageY:18 //            
    radiusX:11.5 //           
    radiusY:11.5 //           
    rotationAngle:0 //     
    screenX:560 //            
    screenY:175 //            
target:div#touchLog     
__proto__:Touch
__proto__:TouchList
       TouchList   。               (touchstart、touchmove、touchend)    ,             。          Touch    ,Touch                   ,                            。

      radiusX,radiusY,rotationAngle                             ,                    ,                  ,          。             TouchList        length   ,       1  ,                (  :touchstart   ),    ,                 ,               Touch    。              ,     TouchList       Touch   ,          0 。TouchList         target   ,        ,       。

                   ,                :

   mozilla
1.Touch.identifier:  Touch         。       (          )            ,      。                      ,       。

 
2.Touch.screenX:           X  。    。

 
3.Touch.screenY:           Y  。    。

 
4.Touch.clientX:         (visual viewport)    X  。         。    。

 
5.Touch.clientY:         (visual viewport)    Y  。         。    。

 
6.Touch.pageX:     HTML      X  。           ,             。    。

 
7.Touch.pageY:     HTML      Y  。           ,             。    。

 
8.Touch.radiusX:                        (X )  。        screenX   。    。

 
9.Touch.radiusY:                        (Y )  。        screenY   。    。

 
10.Touch.rotationAngle:         : radiusX   radiusY         ,              ,                    。    。

 
11.Touch.force:             , 0.0(    ) 1.0(    )    。    。

 
12.Touch.target:            (  touchstart    )HTML  。          ,                     ,               。      ,               ,          ,             window   document   。  ,                ,                       ,        ,                        。    。

TOUCHスライド方向判断
方法1:
touchstartイベントが開始されると、現在の指の横座標startXと縦座標startYが取得されます.touchmoveイベントがトリガーされると、このとき指の横座標moveEndXと縦座標moveEndYが取得される.最後に、この2回取得した座標差値により、携帯電話の画面上の指のスライド方向を判断する.
考え方:
touchmoveの最後の座標からtouchstartの開始座標を減算し、Xの結果が正数であれば指が左から右に引かれていることを示します.Xの結果が負数であれば、指が右から左に動いていることを示します.Yの結果が正数であれば、指が上から下に動いていることを示します.Yの結果が負数であれば、指が下から上へと動いていることを示します.
//   js addeventListener       
 var mybody = document.getElementsByTagName('body')[0];

    //    

    var startX, startY, moveEndX, moveEndY, X, Y;   

    mybody.addEventListener('touchstart', function(e) {

        e.preventDefault();

        startX = e.touches[0].pageX;

        startY = e.touches[0].pageY;

    });

    mybody.addEventListener('touchmove', function(e) {

        e.preventDefault();

        moveEndX = e.changedTouches[0].pageX;

        moveEndY = e.changedTouches[0].pageY;

        X = moveEndX - startX;

        Y = moveEndY - startY;

        if ( X > 0 ) {alert(‘  ’);}

        else if ( X < 0 ) {alert(‘  ’);}

        else if ( Y > 0) {alert(‘  ’);}

        else if ( Y < 0 ) { alert(‘  ’);}

        else{alert(‘   ’); }

    });
    
// jquery $.on('touchstart')       

    var startX, startY, moveEndX, moveEndY, X, Y;   

    $('body').on('touchstart', function(e) {

        e.preventDefault();

        startX = e.originalEvent.touches[0].pageX; // jquery                 ,              originalEvent     

        startY = e.touches[0].pageY;

    });

    $('body').on('touchmove', function(e) {

        e.preventDefault();

        moveEndX = e.originalEvent.touches[0].pageX;

        moveEndY = e.originalEvent.touches[0].pageY;

        X = moveEndX - startX;

        Y = moveEndY - startY;

        if ( X > 0 ) {alert(‘  ’);}

        else if ( X < 0 ) {alert(‘  ’);}

        else if ( Y > 0) {alert(‘  ’);}

        else if ( Y < 0 ) { alert(‘  ’);}

        else{alert(‘   ’); }

    });

しかし、実際の操作では、指の上下スライドが直上直下になるのは難しく、少し斜めであれば、少し斜めであれば、X軸の判断で先に引き継がれ、私たちの実際の操作意欲とは乖離している.この場合、特殊な判断テクニックを追加し、コードを以下のように修正する必要があります(作業中は以下のコードでいいです):
//   js addeventListener        jquery        
    var mybody = document.getElementsByTagName('body')[0];

   

    //    

    var startX, startY, moveEndX, moveEndY, X, Y;   

    mybody.addEventListener('touchstart', function(e) {

        e.preventDefault();

        startX = e.touches[0].pageX;

        startY = e.touches[0].pageY;

    }, false);

    mybody.addEventListener('touchmove', function(e) {

        e.preventDefault();

        moveEndX = e.changedTouches[0].pageX;

        moveEndY = e.changedTouches[0].pageY;

        X = moveEndX - startX;

        Y = moveEndY - startY;

        

        if ( Math.abs(X) > Math.abs(Y) && X > 0 ) {

            alert("  ");

        }

        else if ( Math.abs(X) > Math.abs(Y) && X < 0 ) {

            alert("  ");

        }

        else if ( Math.abs(Y) > Math.abs(X) && Y > 0) {

            alert("  ");

        }

        else if ( Math.abs(Y) > Math.abs(X) && Y < 0 ) {

            alert("  ");

        }

        else{

            alert("   ");

        }

    });

 

    ,              ,        ——body         ,     0;
               :

    var mybody = document.getElementsByTagName('body')[0];

    var h = document.documentElement.clientHeight;

        mybody.style.height = h + 'px';

  ,              、  、       。

方法2
  • スライドスクリーンイベントHTML 5のtouchstartスライド開始イベントとtouchmoveスライド終了イベントを使用します.
  • 方向の判断:起点で平面座標系を作り、終点と線を結んで直線を作り、直線とx正半軸で角度を計算する.45度角を方向として線を分割し、例えば、スライド角度が45度以上135度未満であれば、その方向が上向きであると判断する.図に示すように:
  • はMathを用いる.atan 2は、始点と終点が形成する直線角度を計算する.

  • 注意:標準座標系はスクリーン座標系とは異なり、スクリーン座標系では上半軸が負の値であり、変換を実現するには、Y座標の起点と終点を置き換えるだけでよい.
    //   js addeventListener        jquery        
      var h = document.documentElement.clientHeight,
    
              mybody = document.getElementsByTagName('body')[0];
    
              mybody.style.height = h + 'px';
    
     
    
     
    
            //    
    
            function GetSlideAngle(dx,dy) {
    
              return Math.atan2(dy,dx) * 180 / Math.PI;
    
            }
    
     
    
            //            1:  ,2:  ,3:  ,4:  ,0:   
    
            function GetSlideDirection(startX,startY, endX, endY) {
    
              var dy = startY - endY;
    
              var dx = endX - startX;
    
              var result = 0;
    
     
    
              //        
    
              if (Math.abs(dx) < 2 && Math.abs(dy) < 2) {
    
                 return result;
    
              }
    
              var angle = GetSlideAngle(dx, dy);
    
              if (angle >= -45 && angle < 45) {
    
                 result = 4;
    
              }else if (angle >= 45 && angle < 135) {
    
                 result = 1;
    
              }else if (angle >= -135 && angle < -45) {
    
                 result = 2;
    
              }else if ((angle >= 135 && angle <= 180) || (angle >= -180 && angle < -135)) {
    
                 result = 3;
    
              }
    
              return result;
    
            }
    
     
    
     
    
            //    
    
            var startX, startY;
    
            mybody.addEventListener('touchstart', function (ev){
    
              ev.preventDefault();
    
              startX = ev.touches[0].pageX;
    
              startY = ev.touches[0].pageY; 
    
            }, false);
    
     
    
            mybody.addEventListener('touchmove', function (ev){
    
              var endX, endY;
    
              ev.preventDefault();
    
              endX = ev.changedTouches[0].pageX;
    
              endY = ev.changedTouches[0].pageY;
    
     
    
            var direction = GetSlideDirection(startX, startY, endX, endY);
    
            switch (direction){
    
              case 0:
    
                alert("   ");
    
                break;
    
              case 1:
    
                alert("  ");
    
                break;
    
              case 2:
    
                alert("  ");
    
                break;
    
              case 3:
    
                alert("  ");
    
                break;
    
              case 4:
    
                alert("  ");
    
                break;
    
              default:          
    
            } 
    
          }, false);