首頁 web前端 js教程 javascript行動裝置Web開發中對touch事件的封裝實例_javascript技巧

javascript行動裝置Web開發中對touch事件的封裝實例_javascript技巧

May 16, 2016 pm 04:46 PM
javascript touch事件 web開發 行動裝置

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

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

tap事件

tap 事件相當於pc 瀏覽器中的click 效果,雖然在觸控螢幕裝置上click 事件仍然可用,但是在許多裝置上,click 會存在一些延遲,如果想要快速回應的「click」 事件,需要借助touch 事件來實現。

複製程式碼 程式碼如下:

var startTx, startTy;


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,

    endTx = touches.clientX,
 
  // 在部分裝置上touch 事件比較靈敏,導致按下和鬆開手指時的事件座標會出現一點點變化
  if( Math.abs(startTx - endTx)     console.log( 'fire tap event' );

  }

}, false );

doubleTap事件


doubleTap 事件是當手指在相同位置範圍內和極短的時間內兩次敲擊螢幕時觸發的事件。在部分瀏覽器下,doubleTap 事件會選取文本,如果不希望選取文本,可以為元素新增 user-select:none 的 css 屬性。 複製程式碼
程式碼如下:

var isTouchEnd = false,
  lastTime = 0,
  lastTx = null,
  lastTy = null,
End5pirstTouch >  dTapTimer, startTx, startTy, startTime;

element.addEventListener( 'touchstart', function( e ){  if( dTapTimer ){

    clearTimeout( dTapTimer );
    clearTimeout( dTapTimer );
    clearTimeout( dTapTimer );
}   
  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,
    endTx = touches.clientX,
 now = Date.now(),
    duration = now - lastTime;

  // 首先確保能觸發單一的tap 事件

  if( Math.abs(startTx - endTx)     // 兩次tap 的間隔確保在500 毫秒以內
    if( duration       // 本次的tap 位置和上一次的tap 的位置允許一定範圍內的誤差
 null &&
        Math.abs(lastTx - endTx)         Math.abs(lastTy - endTy)
        firstTouchEnd = true;        lastTx = lastTy = null;

    🎜>    }
    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

      if( firstTouchEnd ){

          firstTouchEnd = false;
             dTapTimer = setTimeout(function(){

                 🎜>                  lastTx = lastTy = null;

                    }, 400 );
          }
     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 );
    clearTimeout( lTapTimer );
   

  var attempts = e.touches[0];

 startTx =touches.clientX;

 startTy =touches.clientY;

  lTapTimer = setTimeout(function(){

    console.log( '觸發長按事件' );
  }, 1000 );

  e.preventDefault();

}, false );

element.addEventListener( 'touchmove', function( e ){

  var Touches = e.touches[0],
    endTx = Touches.clientX,
  cli.
  if( lTapTimer && (Math.abs(endTx - startTx) > 5 || Math.abs(endTy - startTy) > 5) ){

   clearTimeout( lTapTimer );

   clearTimeout( lTapTimer );  }
},假 );

element.addEventListener( 'touchend', function( e ){

  if( lTapTimer ){

   clearTimeout( lTapTimer );
    clearTimeout( lTapTimer );
  . ;



滑動活動

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

複製程式碼

程式碼如下:var isTouchMove, startTx, start>; element.addEventListener( 'touchstart', function( e ){
  var Touchs = 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 attempts = e.changedTouches[0],
    endTx = Touches.clientX,
    endTy = Touches.clientY,
  Ty,

    isSwipe = false;


  if( Math.abs(distanceX) >= Math.abs(distanceY) ){
    if( distanceX > 20 ){
      console。 isSwipe = true;
    }
    else if( distanceX       console.log( '觸發向右滑動事件' );   

      isSwipe = true;
    }
  }
  else{
    if( distanceY > 20 ){
    if( distanceY > 20 ){
    if( distanceY > 20 ){
    if( distanceY > 20 ){
    if( distanceY > 20 ){
          
      isSwipe = true;
    }
    else if( distanceY       consoleY       console.log() '後續滑動事件;        
      isSwipe = true;
    }
  }

  if( isSwipe ){

    console.log( '觸發滑動事件' );

  }
}, false );

上面模擬的事件都封裝在MonoEvent中了。
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1674
14
CakePHP 教程
1429
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

如何開始使用C++進行Web開發? 如何開始使用C++進行Web開發? Jun 02, 2024 am 11:11 AM

要使用C++進行Web開發,需要使用支援C++Web應用程式開發的框架,如Boost.ASIO、Beast和cpp-netlib。開發環境中,需要安裝C++編譯器、文字編輯器或IDE以及Web框架。建立Web伺服器,例如使用Boost.ASIO建立伺服器。處理用戶請求,包括解析HTTP請求、產生回應並將其發送回客戶端。可以使用Beast函式庫解析HTTP請求。最後,可以開發一個簡單的Web應用程序,例如使用cpp-netlib庫建立RESTAPI,實現處理HTTPGET和POST請求的端點,並使用J

C++與其他Web開發語言相比有哪些優點和缺點? C++與其他Web開發語言相比有哪些優點和缺點? Jun 03, 2024 pm 12:11 PM

C++在網路開發中的優勢包括速度、效能和低階訪問,而限制包括學習曲線陡峭和記憶體管理要求。在選擇Web開發語言時,開發人員應根據應用程式需求考慮C++的優點和限制。

PHP的當前狀態:查看網絡開發趨勢 PHP的當前狀態:查看網絡開發趨勢 Apr 13, 2025 am 12:20 AM

PHP在現代Web開發中仍然重要,尤其在內容管理和電子商務平台。 1)PHP擁有豐富的生態系統和強大框架支持,如Laravel和Symfony。 2)性能優化可通過OPcache和Nginx實現。 3)PHP8.0引入JIT編譯器,提升性能。 4)雲原生應用通過Docker和Kubernetes部署,提高靈活性和可擴展性。

HTML,CSS和JavaScript:Web開發人員的基本工具 HTML,CSS和JavaScript:Web開發人員的基本工具 Apr 09, 2025 am 12:12 AM

HTML、CSS和JavaScript是Web開發的三大支柱。 1.HTML定義網頁結構,使用標籤如、等。 2.CSS控製網頁樣式,使用選擇器和屬性如color、font-size等。 3.JavaScript實現動態效果和交互,通過事件監聽和DOM操作。

學習C++ Web開發所需的技能和資源有哪些? 學習C++ Web開發所需的技能和資源有哪些? Jun 01, 2024 pm 05:57 PM

C++Web開發需掌握C++程式設計基礎、網路協定與資料庫知識。必備資源包含cppcms、Pistache等Web框架,cppdb、pqxx等資料庫連接器,以及CMake、g++、Wireshark等輔助工具。透過學習實戰案例,如創建簡單的HTTP伺服器,可以開啟C++Web開發之旅。

JavaScript:探索網絡語言的多功能性 JavaScript:探索網絡語言的多功能性 Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

HTML,CSS和JavaScript的未來:網絡開發趨勢 HTML,CSS和JavaScript的未來:網絡開發趨勢 Apr 19, 2025 am 12:02 AM

HTML的未來趨勢是語義化和Web組件,CSS的未來趨勢是CSS-in-JS和CSSHoudini,JavaScript的未來趨勢是WebAssembly和Serverless。 1.HTML的語義化提高可訪問性和SEO效果,Web組件提升開發效率但需注意瀏覽器兼容性。 2.CSS-in-JS增強樣式管理靈活性但可能增大文件體積,CSSHoudini允許直接操作CSS渲染。 3.WebAssembly優化瀏覽器應用性能但學習曲線陡,Serverless簡化開發但需優化冷啟動問題。

See all articles