美文网首页
移动端touch事件

移动端touch事件

作者: 百度怎么用 | 来源:发表于2017-03-14 09:28 被阅读0次
    <!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{width: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>
    

    相关文章

      网友评论

          本文标题:移动端touch事件

          本文链接:https://www.haomeiwen.com/subject/ejycnttx.html