最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript移動設(shè)備Web開發(fā)中對touch事件的封裝實例

 更新時間:2014年06月05日 08:56:12   投稿:junjie  
這篇文章主要介紹了javascript移動設(shè)備Web開發(fā)中對touch事件的封裝實例,分別對tap事件、doubleTap事件、longTap事件、swipe事件做了封裝,需要的朋友可以參考下

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

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

tap事件

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

復(fù)制代碼 代碼如下:

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)致按下和松開手指時的事件坐標會出現(xiàn)一點點變化
  if( Math.abs(startTx - endTx) < 6 && Math.abs(startTy - endTy) < 6 ){
    console.log( 'fire tap event' );
  }
}, false );

doubleTap事件

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

復(fù)制代碼 代碼如下:

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

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

}

longTap事件

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

復(fù)制代碼 代碼如下:

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 事件是當手指在屏幕上滑動后觸發(fā)的事件,根據(jù)手指滑動的方向又分為 swipeLeft (向左)、swipeRight (向右)、swipeUp (向上)、swipeDown (向下)。

復(fù)制代碼 代碼如下:

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:這里再為大家推薦一款關(guān)于JS事件的在線查詢工具,歸納總結(jié)了JS常用的事件類型與函數(shù)功能:

javascript事件與功能說明大全:

http://tools.jb51.net/table/javascript_event

相關(guān)文章

  • javaScript同意等待代碼實現(xiàn)心得

    javaScript同意等待代碼實現(xiàn)心得

    javaScript功能描述:本程序?qū)崿F(xiàn)在同意某某協(xié)議頁面對同意按鈕進行十秒鐘的禁用,同時在按鈕的Value顯示倒計時。
    2011-01-01
  • js格式化時間的方法

    js格式化時間的方法

    這篇文章主要介紹了js格式化時間的方法,對javascript時間格式化的方法進行了總結(jié),感興趣的小伙伴們可以參考一下
    2015-12-12
  • 利用HTML5的畫布Canvas實現(xiàn)刮刮卡效果

    利用HTML5的畫布Canvas實現(xiàn)刮刮卡效果

    大家都玩過刮刮樂吧,都想一夜暴富,本文給大家分享一款利用HTML5的畫布Canvas實現(xiàn)刮刮卡效果,需要的朋友可以參考下
    2015-09-09
  • 借用Google的Javascript API Loader來加速你的網(wǎng)站

    借用Google的Javascript API Loader來加速你的網(wǎng)站

    加速頁面加載速度有一個方法就是把CSS和JS文件放到另外一個單獨的服務(wù)器上,這樣在訪問量比較大的情況下可以分擔主服務(wù)器的壓力
    2009-01-01
  • 微信小程序?qū)崿F(xiàn)YDUI的ScrollNav組件

    微信小程序?qū)崿F(xiàn)YDUI的ScrollNav組件

    這篇文章主要為大家詳細介紹了微信小程序?qū)崿F(xiàn)YDUI的ScrollNav組件,滾動導(dǎo)航效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • js showModalDialog 彈出對話框的簡單實例(子窗體)

    js showModalDialog 彈出對話框的簡單實例(子窗體)

    本篇文章主要是對js_showModalDialog彈出對話框的簡單實例(子窗體) 進行了詳細的介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • js省市縣三級聯(lián)動效果實例

    js省市縣三級聯(lián)動效果實例

    這篇文章主要介紹了js實現(xiàn)簡單的省市縣三級聯(lián)動效果,以完整實例形式分析了JavaScript實現(xiàn)省市縣三級聯(lián)動效果的具體步驟與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2016-05-05
  • 純JS實現(xiàn)監(jiān)控本地文件變化

    純JS實現(xiàn)監(jiān)控本地文件變化

    你是否曾夢想擁有一個能夠?qū)崟r監(jiān)控本地文件變化的網(wǎng)頁應(yīng)用,現(xiàn)在,這個夢想即將成為現(xiàn)實,本文將通過純JS實現(xiàn)這一功能,感興趣的小伙伴可以了解下
    2025-04-04
  • 最新評論

    故城县| 曲水县| 武城县| 昭通市| 正阳县| 杭州市| 交城县| 博乐市| 河东区| 滕州市| 丽江市| 福州市| 平果县| 金塔县| 柳林县| 卫辉市| 纳雍县| 林周县| 荔波县| 长阳| 太湖县| 湖口县| 桃江县| 平江县| 湄潭县| 黔江区| 喀什市| 馆陶县| 和静县| 塔城市| 黄龙县| 抚宁县| 江达县| 炎陵县| 隆昌县| 蓝山县| 漳平市| 嫩江县| 抚顺县| 玛沁县| 花莲市|