移动端touch事件封装

移动端touch事件封装

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">
<title>无标题文档</title>
<style>
        div{100px;height:100px;line-height:100px;margin-bottom:10px;background:red;text-align:center;color:#fff;}
</style>
<script>
        /***
                @name:触屏事件
                @param {string} element dom元素
                           {function} fn 事件触发函数
        ***/
        
        var touchEvent={
                
                /*单次触摸事件*/
                tap:function(element,fn){
                        var startTx, startTy;
                        element.addEventListener('touchstart',function(e){
                          var touches = e.touches[0];
                          startTx = touches.clientX;
                          startTy = touches.clientY;
                        }, false );
                        
                        element.addEventListener('touchend',function(e){
                          var touches = e.changedTouches[0],
                          endTx = touches.clientX,
                          endTy = touches.clientY;
                          // 在部分设备上 touch 事件比较灵敏,导致按下和松开手指时的事件坐标会出现一点点变化
                          if( Math.abs(startTx - endTx) < 6 && Math.abs(startTy - endTy) < 6 ){
                                fn();
                          }
                        }, false );
                },
                
                /*两次触摸事件*/
                doubleTap:function(element,fn){
                        var isTouchEnd = false,
                        lastTime = 0,
                        lastTx = null,
                        lastTy = null,
                        firstTouchEnd = true,
                        body = document.body,
                        dTapTimer, startTx, startTy, startTime;
                        element.addEventListener( 'touchstart', function(e){
                          if( dTapTimer ){
                                clearTimeout( dTapTimer );
                                dTapTimer = null;
                          }
                          var touches = e.touches[0];
                          startTx = touches.clientX;
                          startTy = touches.clientY;   
                        }, false );
                        element.addEventListener( 'touchend',function(e){
                          var touches = e.changedTouches[0],
                          endTx = touches.clientX,
                          endTy = touches.clientY,
                          now = Date.now(),
                          duration = now - lastTime;
                          // 首先要确保能触发单次的 tap 事件
                          if( Math.abs(startTx - endTx) < 6 && Math.abs(startTx - endTx) < 6 ){
                                // 两次 tap 的间隔确保在 500 毫秒以内
                                if(duration < 301 ){
                                  // 本次的 tap 位置和上一次的 tap 的位置允许一定范围内的误差
                                  if( lastTx !== null &&
                                        Math.abs(lastTx - endTx) < 45 &&
                                        Math.abs(lastTy - endTy) < 45 ){
                                          firstTouchEnd = true;
                                          lastTx = lastTy = null;
                                          fn();
                                        }
                                  }
                                  else{
                                        lastTx = endTx;
                                        lastTy = endTy;
                                  }
                                }
                                else{
                                  firstTouchEnd = true;
                                  lastTx = lastTy = null;
                                }
                                lastTime = now;
                          }, false );
                          // 在 iOS 的 safari 上手指敲击屏幕的速度过快,
                          // 有一定的几率会导致第二次不会响应 touchstart 和 touchend 事件
                          // 同时手指长时间的touch不会触发click
                          if(~navigator.userAgent.toLowerCase().indexOf('iphone os')){
                                body.addEventListener( 'touchstart', function(e){
                                  startTime = Date.now();
                                }, true );
                                body.addEventListener( 'touchend', function(e){
                                  var noLongTap = Date.now() - startTime < 501;
                                  if(firstTouchEnd ){
                                        firstTouchEnd = false;
                                        if( noLongTap && e.target === element ){
                                          dTapTimer = setTimeout(function(){
                                                firstTouchEnd = true;
                                                lastTx = lastTy = null;
                                                fn();
                                          },400);
                                        }
                                  }
                                  else{
                                        firstTouchEnd = true;
                                  }
                                }, true );
                                // iOS 上手指多次敲击屏幕时的速度过快不会触发 click 事件
                                element.addEventListener( 'click', function( e ){
                                  if(dTapTimer ){
                                        clearTimeout( dTapTimer );
                                        dTapTimer = null;
                                        firstTouchEnd = true;
                                  }
                                }, false );
                        }        
                },
                
                /*长按事件*/
                longTap:function(element,fn){
                        var startTx, startTy, lTapTimer;
                        element.addEventListener( 'touchstart', function( e ){
                          if( lTapTimer ){
                                clearTimeout( lTapTimer );
                                lTapTimer = null;
                          }
                          var touches = e.touches[0];
                          startTx = touches.clientX;
                          startTy = touches.clientY;
                          lTapTimer = setTimeout(function(){
                                fn();
                          }, 1000 );
                          e.preventDefault();
                        }, false );
                        element.addEventListener( 'touchmove', function( e ){
                          var touches = e.touches[0],
                                endTx = touches.clientX,
                                endTy = touches.clientY;
                          if( lTapTimer && (Math.abs(endTx - startTx) > 5 || Math.abs(endTy - startTy) > 5) ){
                                clearTimeout( lTapTimer );
                                lTapTimer = null;
                          }
                        }, false );
                        element.addEventListener( 'touchend', function( e ){
                          if( lTapTimer ){
                                clearTimeout( lTapTimer );
                                lTapTimer = null;
                          }
                        }, false );        
                },
                
                /*滑屏事件*/
                swipe:function(element,fn){
                        var isTouchMove, startTx, startTy;
                        element.addEventListener( 'touchstart', function( e ){
                          var touches = e.touches[0];
                          startTx = touches.clientX;
                          startTy = touches.clientY;
                          isTouchMove = false;
                        }, false );
                        element.addEventListener( 'touchmove', function( e ){
                          isTouchMove = true;
                          e.preventDefault();
                        }, false );
                        element.addEventListener( 'touchend', function( e ){
                          if( !isTouchMove ){
                                return;
                          }
                          var touches = e.changedTouches[0],
                                endTx = touches.clientX,
                                endTy = touches.clientY,
                                distanceX = startTx - endTx
                                distanceY = startTy - endTy,
                                isSwipe = false;
                          if( Math.abs(distanceX)>20||Math.abs(distanceY)>20 ){
                                fn();
                          }
                        }, false );        
                },
                
                /*向上滑动事件*/
                swipeUp:function(element,fn){
                        var isTouchMove, startTx, startTy;
                        element.addEventListener( 'touchstart', function( e ){
                          var touches = e.touches[0];
                          startTx = touches.clientX;
                          startTy = touches.clientY;
                          isTouchMove = false;
                        }, false );
                        element.addEventListener( 'touchmove', function( e ){
                          isTouchMove = true;
                          e.preventDefault();
                        }, false );
                        element.addEventListener( 'touchend', function( e ){
                          if( !isTouchMove ){
                                return;
                          }
                          var touches = e.changedTouches[0],
                                endTx = touches.clientX,
                                endTy = touches.clientY,
                                distanceX = startTx - endTx
                                distanceY = startTy - endTy,
                                isSwipe = false;
                          if( Math.abs(distanceX) < Math.abs(distanceY) ){
                                  if( distanceY > 20 ){
                                          fn();       
                                          isSwipe = true;
                                  }
                          }
                        }, false );        
                },
                
                /*向下滑动事件*/
                swipeDown:function(element,fn){
                        var isTouchMove, startTx, startTy;
                        element.addEventListener( 'touchstart', function( e ){
                          var touches = e.touches[0];
                          startTx = touches.clientX;
                          startTy = touches.clientY;
                          isTouchMove = false;
                        }, false );
                        element.addEventListener( 'touchmove', function( e ){
                          isTouchMove = true;
                          e.preventDefault();
                        }, false );
                        element.addEventListener( 'touchend', function( e ){
                          if( !isTouchMove ){
                                return;
                          }
                          var touches = e.changedTouches[0],
                                endTx = touches.clientX,
                                endTy = touches.clientY,
                                distanceX = startTx - endTx
                                distanceY = startTy - endTy,
                                isSwipe = false;
                          if( Math.abs(distanceX) < Math.abs(distanceY) ){
                                  if( distanceY < -20  ){
                                          fn();       
                                          isSwipe = true;
                                  }
                          }
                        }, false );        
                },
                
                /*向左滑动事件*/
                swipeLeft:function(element,fn){
                        var isTouchMove, startTx, startTy;
                        element.addEventListener( 'touchstart', function( e ){
                          var touches = e.touches[0];
                          startTx = touches.clientX;
                          startTy = touches.clientY;
                          isTouchMove = false;
                        }, false );
                        element.addEventListener( 'touchmove', function( e ){
                          isTouchMove = true;
                          e.preventDefault();
                        }, false );
                        element.addEventListener( 'touchend', function( e ){
                          if( !isTouchMove ){
                                return;
                          }
                          var touches = e.changedTouches[0],
                                endTx = touches.clientX,
                                endTy = touches.clientY,
                                distanceX = startTx - endTx
                                distanceY = startTy - endTy,
                                isSwipe = false;
                          if( Math.abs(distanceX) >= Math.abs(distanceY) ){
                                  if( distanceX > 20  ){
                                          fn();       
                                          isSwipe = true;
                                  }
                          }
                        }, false );        
                },
                
                /*向右滑动事件*/
                swipeRight:function(element,fn){
                        var isTouchMove, startTx, startTy;
                        element.addEventListener( 'touchstart', function( e ){
                          var touches = e.touches[0];
                          startTx = touches.clientX;
                          startTy = touches.clientY;
                          isTouchMove = false;
                        }, false );
                        element.addEventListener( 'touchmove', function( e ){
                          isTouchMove = true;
                          e.preventDefault();
                        }, false );
                        element.addEventListener( 'touchend', function( e ){
                          if( !isTouchMove ){
                                return;
                          }
                          var touches = e.changedTouches[0],
                                endTx = touches.clientX,
                                endTy = touches.clientY,
                                distanceX = startTx - endTx
                                distanceY = startTy - endTy,
                                isSwipe = false;
                          if( Math.abs(distanceX) >= Math.abs(distanceY) ){
                                  if( distanceX < -20  ){
                                          fn();       
                                          isSwipe = true;
                                  }
                          }
                        }, false );        
                }
                
        }
</script>
<script>
        window.onload=function(){
                var aDiv=document.getElementsByTagName("div");
                
                touchEvent.tap(aDiv[0],function(){
                        alert("单次触摸");
                })
                
                touchEvent.doubleTap(aDiv[1],function(){
                        alert("两次触摸");
                })
                
                touchEvent.longTap(aDiv[2],function(){
                        alert("长按");
                })
                
                touchEvent.swipe(document,function(){
                        alert("滑屏了");
                })
                
                touchEvent.swipeUp(document,function(){
                        alert("向上滑屏了");
                })
                
                touchEvent.swipeDown(document,function(){
                        alert("向下滑屏了");
                })
                
                touchEvent.swipeLeft(document,function(){
                        alert("向左滑屏了");
                })
                
                touchEvent.swipeRight(document,function(){
                        alert("向右滑屏了");
                })
        }
        
</script>
</head>
<body>
        <div class="box1">单次触摸我</div>
    <div class="box2">两次触摸</div>
    <div class="box3">长按我</div>
    <span>试一试在屏幕上任意区域滑动</span>
</body>
</html>

  

原文地址:https://www.cnblogs.com/miid/p/4367914.html