亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript移動設備Web開發中對touch事件的封裝實例

2019-11-20 14:56:28
字體:
來源:轉載
供稿:網友

在觸屏設備上,一些比較基礎的手勢都需要通過對 touch 事件進行二次封裝才能實現。
zepto 是移動端上使用率比較高的一個類庫,但是其 touch 模塊模擬出來的一些事件存在一些兼容性問題,如 tap 事件在某些安卓設備上存在事件穿透的 bug,其他類型的事件也或多或少的存在一些兼容性問題。

于是乎,干脆自己動手對這些常用的手勢事件進行了封裝,由于沒有太多真實的設備來進行測試,可能存在一些兼容性問題,下面的代碼也只是在 iOS 7、Andorid 4 上的一些比較常見的瀏覽器中測試通過。

tap事件

tap 事件相當于 pc 瀏覽器中的 click 效果,雖然在觸屏設備上 click 事件仍然可用,但是在很多設備上,click 會存在一些延遲,如果想要快速響應的 “click” 事件,需要借助 touch 事件來實現。

復制代碼 代碼如下:

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 ){
    console.log( 'fire tap event' );
  }
}, false );

doubleTap事件

doubleTap 事件是當手指在相同位置范圍內和極短的時間內兩次敲擊屏幕時觸發的事件。在部分瀏覽器下,doubleTap 事件會選中文本,如果不希望選中文本,可以給元素添加 user-select:none 的 css 屬性。

復制代碼 代碼如下:

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;
        console.log( 'fire double tap event' );
      }
    }
    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;
                  console.log( 'fire double tap event' );
              }, 400 );
          }
      }
      else{
          firstTouchEnd = true;
      }
  }, true );

// iOS 上手指多次敲擊屏幕時的速度過快不會觸發 click 事件
element.addEventListener( 'click', function( e ){
  if( dTapTimer ){
    clearTimeout( dTapTimer );
    dTapTimer = null;
    firstTouchEnd = true;
  }
}, false );

}

longTap事件

longTap 事件是當手指長時間按住屏幕保持不動時觸發的事件。

復制代碼 代碼如下:

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(){
    console.log( 'fire long tap event' );
  }, 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事件

swipe 事件是當手指在屏幕上滑動后觸發的事件,根據手指滑動的方向又分為 swipeLeft (向左)、swipeRight (向右)、swipeUp (向上)、swipeDown (向下)。

復制代碼 代碼如下:

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 ){
      console.log( 'fire swipe left event' );
      isSwipe = true;
    }
    else if( distanceX < -20 ){
      console.log( 'fire swipe right event' );   
      isSwipe = true;
    }
  }
  else{
    if( distanceY > 20 ){
      console.log( 'fire swipe up event' );       
      isSwipe = true;
    }
    else if( distanceY < -20 ){
      console.log( 'fire swipe down event' );        
      isSwipe = true;
    }
  }

  if( isSwipe ){
    console.log( 'fire swipe event' );
  }
}, false );

上面模擬的事件都封裝在 MonoEvent 中了。完整代碼地址:https://github.com/chenmnkken/monoevent,需要的朋友看看吧~

 PS:這里再為大家推薦一款關于JS事件的在線查詢工具,歸納總結了JS常用的事件類型與函數功能:

javascript事件與功能說明大全:

http://tools.VeVB.COm/table/javascript_event

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚州精品天堂中文字幕| 欧美日韩国产成人高清视频| 国产在线观看精品| 欧美又大又粗又长| 国自在线精品视频| 欧美激情视频网站| 一区二区三区视频观看| 亚洲一区二区三区乱码aⅴ| 久久久亚洲欧洲日产国码aⅴ| 日韩av在线电影网| 日韩在线观看免费网站| 久久久久久亚洲精品中文字幕| 国产91精品久久久久久| www.国产精品一二区| 色黄久久久久久| 欧美午夜视频在线观看| 国产一区二区三区精品久久久| 国产欧美婷婷中文| 欧美性猛交xxxx免费看| 日韩av在线网页| 韩剧1988在线观看免费完整版| 久久亚洲精品一区二区| 日韩一区二区精品视频| 国产精品视频一区二区三区四| 亚洲国产99精品国自产| 国产亚洲精品一区二555| 成人动漫网站在线观看| 亚洲欧美日本伦理| 欧美最顶级丰满的aⅴ艳星| 欧美日韩国产一区在线| 亚洲一级免费视频| 高清一区二区三区日本久| 亚洲天堂开心观看| 久久国产精品网站| 欧美激情精品久久久久久大尺度| 97涩涩爰在线观看亚洲| 欧美另类69精品久久久久9999| 国产精品美腿一区在线看| 在线视频日本亚洲性| 欧美电影免费观看大全| 欧美巨大黑人极品精男| 国产精品免费看久久久香蕉| 欧美日韩免费看| 国产99久久精品一区二区| 亚洲综合色激情五月| 色偷偷噜噜噜亚洲男人的天堂| 精品人伦一区二区三区蜜桃网站| 久久久伊人欧美| 国产精品亚洲美女av网站| 欧美日韩中文字幕| 国产成人亚洲综合| 欧美日韩高清区| 日韩欧美有码在线| 日本成熟性欧美| 亚洲精品国偷自产在线99热| 欧美黑人xxxⅹ高潮交| 一区二区三区久久精品| 久久亚洲国产精品成人av秋霞| 精品国产成人在线| 日韩欧美成人网| 精品高清一区二区三区| 91精品国产91久久久| 亚洲欧美日韩视频一区| 久久久久九九九九| 国产一区欧美二区三区| 成人黄色免费在线观看| 国产欧美日韩免费看aⅴ视频| 日韩av在线精品| 亚洲第一网站免费视频| 亚洲自拍av在线| 日韩av在线免费观看一区| 亚洲精品国产精品国自产观看浪潮| 日韩在线视频中文字幕| 亚洲综合中文字幕68页| 欧美成人第一页| 亚洲社区在线观看| 一区二区三区回区在观看免费视频| 伊人伊成久久人综合网站| 91中文精品字幕在线视频| 91国语精品自产拍在线观看性色| 久久国产精品影片| 美女视频久久黄| 国产精品久久久久77777| 欧美激情综合色| 92看片淫黄大片欧美看国产片| 欧美亚洲一区在线| 国产精品免费久久久久久| 亚洲欧洲日韩国产| 久久不射电影网| 国产成人精品av在线| 国产精品视频久久久| 欧美久久久精品| 成人妇女免费播放久久久| 久久精品99久久香蕉国产色戒| 97国产在线观看| 日韩中文字幕国产精品| 亚洲欧美999| 亚洲第一页自拍| 久久中文字幕在线| 日韩欧美一区视频| 欧美老女人性视频| 亚洲男人天堂手机在线| 国产精品91视频| 日本精品一区二区三区在线| 成人免费观看49www在线观看| 韩国日本不卡在线| 国产成人精品av在线| 欧美不卡视频一区发布| 久久精品中文字幕电影| 国产精品免费福利| 精品久久久久久久久久ntr影视| 国模视频一区二区三区| 国产精品久久久久久一区二区| 久久久久一本一区二区青青蜜月| 欧美成人h版在线观看| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲男人天堂网站| 奇门遁甲1982国语版免费观看高清| 国产亚洲a∨片在线观看| 91最新在线免费观看| 久久久精品影院| 欧美在线观看网站| 日产精品99久久久久久| 最近2019中文字幕在线高清| 日韩人体视频一二区| 欧美激情一级欧美精品| 久久久久久com| 日韩成人免费视频| 国产日产欧美a一级在线| 国产精品国产三级国产aⅴ9色| **欧美日韩vr在线| 日韩欧美中文字幕在线观看| 在线成人激情黄色| 亚洲欧美激情四射在线日| 日韩女优人人人人射在线视频| 欧美色播在线播放| 国产一区二区在线免费视频| 久久久视频精品| 欧美高清性猛交| 亚洲性av在线| 亚洲剧情一区二区| 1769国产精品| 久久久久久久久久久久av| 中文字幕精品一区二区精品| 日韩风俗一区 二区| 欧美国产日本在线| 亚洲午夜未满十八勿入免费观看全集| xxxx性欧美| 91精品国产91久久久久久| 97国产精品久久| 成人妇女淫片aaaa视频| 九九热精品在线| 欧美激情在线播放| 欧美激情第6页| 久久中文字幕一区| 亚洲精品美女在线观看| 久久艳片www.17c.com| 97精品国产aⅴ7777| 久久99精品视频一区97| 中文字幕亚洲一区在线观看| 精品电影在线观看| 亚洲美女av黄| 欧美激情一级精品国产| 亚洲视频欧洲视频|