JS--M端事件

移動端(Mobile 端,簡稱 M 端)開發中,由于設備特性(觸摸屏、手勢操作等),需要處理一些與桌面端不同的事件。這些事件主要針對觸摸交互、手勢識別等場景

一、觸摸事件(Touch Events)

觸摸事件是 M 端最基礎的交互事件,用于響應手指在屏幕上的操作:

事件名觸發時機常用場景
touchstart手指觸摸到元素時觸發開始拖拽、播放動畫
touchmove手指在元素上滑動時持續觸發拖拽元素、滑動控制
touchend手指離開屏幕時觸發結束拖拽、提交操作
touchcancel觸摸被中斷時觸發(如彈窗彈出、電話接入)清理臨時狀態
事件對象屬性(TouchEvent

觸摸事件對象包含與觸摸相關的關鍵信息:

  • touches:當前屏幕上所有觸摸點的列表(Touch 對象數組)。
  • targetTouches:當前元素上所有觸摸點的列表。
  • changedTouches:觸發當前事件的觸摸點列表(如 touchend 中是離開的觸摸點)。

每個 Touch 對象包含位置信息:

  • clientX/clientY:觸摸點相對于視口的坐標。
  • pageX/pageY:觸摸點相對于文檔的坐標(含滾動距離)。
示例:監聽觸摸滑動方向
const box = document.getElementById('box');
let startX, startY;// 記錄觸摸開始位置
box.addEventListener('touchstart', function(e) {startX = e.touches[0].clientX;startY = e.touches[0].clientY;
});// 監聽滑動過程
box.addEventListener('touchmove', function(e) {// 阻止頁面默認滾動(可選)e.preventDefault();const moveX = e.touches[0].clientX - startX;const moveY = e.touches[0].clientY - startY;// 簡單判斷滑動方向if (Math.abs(moveX) > Math.abs(moveY)) {console.log(moveX > 0 ? '向右滑' : '向左滑');} else {console.log(moveY > 0 ? '向下滑' : '向上滑');}
});

二、手勢事件(Gesture Events)

手勢事件用于識別復雜的觸摸交互(如縮放、旋轉),通常基于兩個手指的操作:

事件名觸發時機常用場景
gesturestart兩個手指開始觸摸時觸發開始縮放/旋轉
gesturechange兩個手指移動時觸發(實時變化)調整縮放比例/角度
gestureend兩個手指離開時觸發結束縮放/旋轉
事件對象屬性
  • scale:手勢的縮放比例(初始為 1,大于 1 是放大,小于 1 是縮小)。
  • rotation:手勢的旋轉角度(單位為度,正值為順時針,負值為逆時針)。
示例:實現圖片縮放旋轉
const img = document.getElementById('img');
let currentScale = 1;
let currentRotation = 0;// 監聽手勢開始
img.addEventListener('gesturestart', function(e) {e.preventDefault(); // 阻止默認行為
});// 監聽手勢變化
img.addEventListener('gesturechange', function(e) {e.preventDefault();// 更新縮放和旋轉currentScale *= e.scale;currentRotation += e.rotation;// 應用變換img.style.transform = `scale(${currentScale}) rotate(${currentRotation}deg)`;
});

三、觸摸與點擊的區別

  • click 事件:在移動端也會觸發,但存在 300ms 延遲(歷史原因,用于判斷是否雙擊縮放),且在 touchend 后才觸發。
  • touch 事件:無延遲,更適合需要快速響應的場景(如游戲、滑動交互)。
解決 click 延遲問題:
  1. 使用 touchstart 替代 click(需注意防止誤觸)。
  2. 添加 <meta name="viewport" content="width=device-width"> 可消除部分瀏覽器的 300ms 延遲。
  3. 使用庫(如 FastClick)優化。

四、常見問題與優化

  1. 觸摸穿透(Touch Through)

    • 現象:點擊上層元素后,下層元素的 click 事件被觸發。
    • 解決:在 touchend 中使用 e.preventDefault(),或避免多層疊加可點擊元素。
  2. 滑動沖突

    • 現象:內部元素滑動時,頁面整體也會滾動(如輪播圖滑動 vs 頁面滾動)。
    • 解決:在 touchmove 中根據滑動方向判斷是否阻止默認行為(e.preventDefault())。
  3. 事件防抖

    • touchmove 觸發頻率極高,需通過防抖限制處理頻率:
    let isProcessing = false;
    box.addEventListener('touchmove', function(e) {if (!isProcessing) {requestAnimationFrame(function() {// 處理滑動邏輯isProcessing = false;});isProcessing = true;}
    });
    

五、庫與框架支持

對于復雜手勢(如滑動刪除、捏合縮放),推薦使用成熟庫簡化開發:

  • Hammer.js:輕量級手勢庫,支持滑動、縮放、旋轉等。
  • AlloyFinger:騰訊團隊開發的移動端手勢庫,體積小、API 簡潔。

總結

M 端事件的核心是觸摸交互,主要包括:

  • 基礎觸摸事件(touchstart/touchmove/touchend):處理單指滑動、點擊等。
  • 手勢事件(gesturestart/gesturechange/gestureend):處理雙指縮放、旋轉等。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90049.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90049.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90049.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux網絡編程-tcp

tcp、udp對比&#xff1a;UDP1. 特點無連接&#xff1a;無需建立連接即可發送數據。不可靠&#xff1a;不保證數據順序或完整性。低延遲&#xff1a;適合實時性要求高的場景。2. 應用場景視頻/音頻流傳輸&#xff08;如直播&#xff09;。DNS 查詢、在線游戲。TCP1. 特點面向連…

記一次flink資源使用優化

一.現狀分析 現有任務的資源配置如下&#xff0c;根據ui監控中Garbage Collection可以發現&#xff0c;此任務頻繁的發生GC&#xff0c;且老年代GC時間較久二.整體memory使用分析如下Framework Heap&#xff08;框架堆內存&#xff09;用于Flink框架自身的堆內存&#xff08;如…

Vue底層換成啥了?如何更新DOM的?

摘要&#xff1a;之前的vue是使用虛擬 DOM的&#xff0c;但是Vue 3.6 帶來了一個意義重大的更新&#xff1a; Vapor Mode 渲染模式。Vue 渲染策略的演進&#xff1a; Vue 1.x&#xff1a; 基于模板渲染策略&#xff0c;直接將模板轉換為DOM元素&#xff0c;并為每個DOM元素創建…

0722 數據結構順序表

Part 1.順序表的代碼一.順序表的內存申請head.h: typedef int datatype;typedef struct sqlist {//數據元素datatype data[MAXSIZE];//順序表長度int len;}*sqlist; //*sqlist的作用: //sqlist:struct Sqlist * sqlist create();head.c: sqlist create() {sqlist list (sqlist)…

為何在 Vue 的 v-model 指令中不能使用可選鏈(Optional Chaining)?

Vue 的 v-model 是實現組件與數據雙向綁定的核心指令之一&#xff0c;它本質上是一個語法糖&#xff0c;用于簡化對表單元素和組件 props 的同步更新。然而&#xff0c;在 Vue 3&#xff08;以及 Vue 2 的某些模式下&#xff09;&#xff0c;開發者嘗試在 v-model 中使用 JavaS…

基于單片機智能藥盒/智能藥箱/定時吃藥系統

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 本設計實現了一種基于單片機的智能藥盒&#xff0c;系統以微控制器&#xff08;如STM32&#xff…

(25)python+playwright自動化處理單選和多選按鈕-中

1.簡介上一篇中講解和介紹的單選框有點多&#xff0c;而且由于時間的關系&#xff0c;決定今天講解和分享復選框的相關知識。2.什么是單選框、復選框&#xff1f;單選按鈕一般叫raido button&#xff0c;就像我們在電子版的單選答題過程一樣&#xff0c;單選只能點擊一次&#…

Nginx IP授權頁面實現步驟

目標&#xff1a;一、創建白名單文件sudo mkdir -p /usr/local/nginx/conf/whitelist sudo touch /usr/local/nginx/conf/whitelist/temporary.conf二、創建Python認證服務文件路徑&#xff1a;/opt/script/auth_server.pyimport os import time from flask import Flask, requ…

2025年7月中科院一區-向光生長優化算法Phototropic growth algorithm-附Matlab免費代碼

引言 本期介紹一種新的元啟發式算法——向光生長優化算法Phototropic growth algorithm&#xff0c;PGA。靈感來自植物細胞在陽光下的生長模式。于2025年7月最新發表在JCR 1區&#xff0c;中科院1區 SCI 期刊 Knowledge-Based Systems。 該算法將生物學啟發的確定性生長行為與…

poi-excel-添加水印

1、官網快速指南 https://poi.apache.org/components/spreadsheet/quick-guide.html 訪問如上地址可以查看到poi的相關操作方式&#xff1a; How to create a new workbookHow to create a sheetHow to create cellsHow to create date cellsWorking with different types of…

STM32 開發的鼠標:技術詳解與實現指南

概述基于STM32微控制器開發的鼠標是一種高度可定化的輸入設備解決方案&#xff0c;廣泛應用于工業控制、嵌入式系統、特殊人機交互等領域。相比傳統鼠標&#xff0c;STM32鼠標具有以下優勢&#xff1a;高度可定制性&#xff1a;可添加特殊功能按鍵、傳感器集成低功耗設計&#…

GoLang教程007:打印空心金字塔

4.6 案例一&#xff1a;打印金字塔編寫一個程序&#xff0c;可以接收一個整數&#xff0c;表示層數&#xff0c;打印出金字塔。1??第一步&#xff1a;打印一個矩形 package mainimport "fmt"func main() {// i表示層數for i : 1; i < 3; i {// j表示每層打印多少…

iOS開發 Swift 速記3:運算符與控制結構

初級代碼游戲的專欄介紹與文章目錄-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。 這些代碼大部分以Linux為目標但部分代碼是純C的&#xff0c;可以在任何平臺上使用。 源碼指引&#xff1a;github源…

ElasticSearch中需要注意的點,附官方文檔解讀

1.批量更新數量大小限制 https://www.elastic.co/guide/cn/elasticsearch/guide/current/bulk.html#_How_Big_Is_Too_Big 整個批量請求都需要由接收到請求的節點加載到內存中&#xff0c;因此該請求越大&#xff0c;其他請求所能獲得的內存就越少。批量請求的大小有一個最佳值…

Git GitHub精通:前端協作開發的“瑞士軍刀“!

前言&#xff1a;為什么你的代碼總是"失蹤"&#xff1f; "啊&#xff01;我的代碼呢&#xff1f;"——這可能是每個程序員都曾發出過的靈魂吶喊。還記得上周我熬夜寫的300行JavaScript&#xff0c;第二天醒來發現被自己手賤覆蓋了&#xff0c;那一刻我深刻…

第 30 場 藍橋·算法入門賽 題解

1. 零食爭議【算法賽】 簽到題&#xff1a;1-7奇數相加 #include <bits/stdc.h> using namespace std; int main() {// 請在此輸入您的代碼cout<<1357;return 0; } 2. 數字炸彈【算法賽】 把n個人看為前n-1和后n-1 &#xff0c; 方便找到是第幾段的第幾個數 #in…

閑庭信步使用圖像驗證平臺加速FPGA的開發:第二十四課——圖像直方圖均衡化的FPGA實現

&#xff08;本系列只需要modelsim即可完成數字圖像的處理&#xff0c;每個工程都搭建了全自動化的仿真環境&#xff0c;只需要雙擊top_tb.bat文件就可以完成整個的仿真&#xff0c;大大降低了初學者的門檻&#xff01;&#xff01;&#xff01;&#xff01;如需要該系列的工程…

LabVIEW 2025安裝包| 免費免激活版下載| 附圖文詳細安裝教程

[軟件名稱]&#xff1a;LabVIEW 2025 [軟件大小]&#xff1a;13 G [系統要求]&#xff1a;支持Win7及更高版本 [下載通道]:夸克網盤 [下載鏈接]: https://pan.quark.cn/s/7e9527cc06a3 &#xff08;建議用手機保存到網盤后&#xff0c;再用電腦下載&#xff09; 更多免費軟件&a…

如何實現泵站的無人值守:御控智慧水務平臺

在城鄉供水、農田灌溉、工業循環水等場景中&#xff0c;泵站作為核心動力設施&#xff0c;其運行效率直接影響水資源調配的穩定性。然而&#xff0c;傳統泵站管理長期面臨三大痛點&#xff1a;人力成本高昂&#xff1a;偏遠地區泵站需24小時值守&#xff0c;單站年均人力成本超…

深度學習篇---車道線循跡

要實現基于深度學習的雙車道線&#xff08;黃色車道線&#xff09;循跡&#xff08;通過預測四個輪子的轉速實現自主控制&#xff09;&#xff0c;需要從數據采集、模型設計、訓練策略、環境適應等多維度系統優化。以下是具體方案及需要注意的關鍵事項&#xff0c;旨在提升精準…