移動端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>無標(biāo)題文檔</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 事件觸發(fā)函數(shù)
    ***/
    
    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;
              // 在部分設(shè)備上 touch 事件比較靈敏枝冀,導(dǎo)致按下和松開手指時的事件坐標(biāo)會出現(xiàn)一點點變化
              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;
              // 首先要確保能觸發(fā)單次的 tap 事件
              if( Math.abs(startTx - endTx) < 6 && Math.abs(startTx - endTx) < 6 ){
                // 兩次 tap 的間隔確保在 500 毫秒以內(nèi)
                if(duration < 301 ){
                  // 本次的 tap 位置和上一次的 tap 的位置允許一定范圍內(nèi)的誤差
                  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 上手指敲擊屏幕的速度過快舀凛,
              // 有一定的幾率會導(dǎo)致第二次不會響應(yīng) touchstart 和 touchend 事件
              // 同時手指長時間的touch不會觸發(fā)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 上手指多次敲擊屏幕時的速度過快不會觸發(fā) 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>試一試在屏幕上任意區(qū)域滑動</span>
</body>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市硫痰,隨后出現(xiàn)的幾起案子朴乖,更是在濱河造成了極大的恐慌祖屏,老刑警劉巖助赞,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異袁勺,居然都是意外死亡雹食,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門期丰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來群叶,“玉大人,你說我怎么就攤上這事钝荡〗至ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵埠通,是天一觀的道長赎离。 經(jīng)常有香客問我,道長端辱,這世上最難降的妖魔是什么梁剔? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮舞蔽,結(jié)果婚禮上荣病,老公的妹妹穿的比我還像新娘。我一直安慰自己渗柿,他們只是感情好个盆,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著做祝,像睡著了一般砾省。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上混槐,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天编兄,我揣著相機與錄音,去河邊找鬼声登。 笑死狠鸳,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悯嗓。 我是一名探鬼主播件舵,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼脯厨!你這毒婦竟也來了铅祸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎临梗,沒想到半個月后涡扼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡盟庞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年吃沪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片什猖。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡票彪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出不狮,到底是詐尸還是另有隱情降铸,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布荤傲,位于F島的核電站垮耳,受9級特大地震影響颈渊,放射性物質(zhì)發(fā)生泄漏遂黍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一俊嗽、第九天 我趴在偏房一處隱蔽的房頂上張望雾家。 院中可真熱鬧,春花似錦绍豁、人聲如沸芯咧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敬飒。三九已至,卻和暖如春芬位,著一層夾襖步出監(jiān)牢的瞬間无拗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工昧碉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留英染,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓被饿,卻偏偏與公主長得像四康,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子狭握,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容