0

0

js怎样实现长按事件 移动端长按触发自定义功能

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-06-17 23:36:02

|

767人浏览过

|

来源于php中文网

原创

实现移动端长按事件的核心方法是监听 touchstart、touchmove 和 touchend 事件,并通过 settimeout 和 cleartimeout 控制触发时机;1. 在 touchstart 中记录起始时间并设置定时器;2. 在 touchmove 中判断移动距离,若超出阈值则清除定时器以避免误触;3. 在 touchend 中判断时间差,决定触发长按或短按;优化体验可通过调整长按阈值、使用 requestanimationframe 提高精度及加入移动容错范围来减少误判;在 react 或 vue 等框架中,可结合状态管理和组件生命周期处理事件绑定与清理;处理手势冲突时需明确优先级,在 touchmove 中进行判断,或借助手势识别库简化流程。

js怎样实现长按事件 移动端长按触发自定义功能

长按事件,移动端搞起来确实有点门道。简单来说,就是监听 touchstart, touchmove, touchend 这几个事件,然后自己算时间。

js怎样实现长按事件 移动端长按触发自定义功能

解决方案

要实现移动端长按事件,核心思路是:记录手指按下和抬起的时间,如果时间差超过一定阈值,就触发长按事件。这里面需要处理好 touchmove 事件,避免滑动干扰长按的判断。

js怎样实现长按事件 移动端长按触发自定义功能
let timer;
let touchstartTime;
const longPressDuration = 500; // 长按阈值,单位毫秒

function touchStart(e) {
  touchstartTime = new Date().getTime();
  timer = setTimeout(() => {
    // 长按事件触发
    longPressHandler(e);
  }, longPressDuration);
}

function touchMove(e) {
  // 移动时,清除定时器,取消长按事件
  clearTimeout(timer);
}

function touchEnd(e) {
  // 手指抬起时,清除定时器
  clearTimeout(timer);
  let touchendTime = new Date().getTime();
  if (touchendTime - touchstartTime < longPressDuration) {
    // 短按事件
    tapHandler(e);
  }
}

function longPressHandler(e) {
  // 长按事件处理函数
  console.log("长按事件触发");
  // 这里可以执行自定义功能
}

function tapHandler(e) {
  // 短按事件处理函数
  console.log("短按事件触发");
}

// 绑定事件监听器
const element = document.getElementById('yourElement');
element.addEventListener('touchstart', touchStart, false);
element.addEventListener('touchmove', touchMove, false);
element.addEventListener('touchend', touchEnd, false);

这段代码的关键在于 setTimeoutclearTimeout 的使用,以及对 touchmove 事件的处理。 移动的时候,要取消掉 setTimeout,不然就误判了。

js怎样实现长按事件 移动端长按触发自定义功能

如何优化长按事件的触发体验,避免误触?

优化长按体验,得从两个方面入手:一是减少误触,二是提升响应速度。

减少误触,可以考虑加入一个容错范围。比如,在长按时间内,允许手指有轻微的移动,只要移动距离不超过一定像素,仍然判定为长按。这个可以通过记录 touchstart 时的坐标,然后在 touchmove 时计算移动距离来实现。

提升响应速度,可以适当缩短长按阈值。但是,阈值太短又容易误触,所以需要根据实际情况调整。另外,可以考虑使用 requestAnimationFrame 来优化定时器的精度。

let startX, startY;
const moveThreshold = 10; // 移动阈值,单位像素

function touchStart(e) {
  startX = e.touches[0].clientX;
  startY = e.touches[0].clientY;
  touchstartTime = new Date().getTime();
  timer = setTimeout(() => {
    longPressHandler(e);
  }, longPressDuration);
}

function touchMove(e) {
  const currentX = e.touches[0].clientX;
  const currentY = e.touches[0].clientY;
  const deltaX = Math.abs(currentX - startX);
  const deltaY = Math.abs(currentY - startY);

  if (deltaX > moveThreshold || deltaY > moveThreshold) {
    clearTimeout(timer);
  }
}

如何在 React 或 Vue 等框架中使用长按事件?

在 React 或 Vue 中使用长按事件,思路和原生 JS 是一样的,只不过需要结合框架的特性来处理事件绑定和状态管理。

Draft&Goal-Detector
Draft&Goal-Detector

检测文本是由 AI 还是人类编写的

下载

以 React 为例:

import React, { useState, useRef, useEffect } from 'react';

function LongPressButton() {
  const [isLongPress, setIsLongPress] = useState(false);
  const timerRef = useRef(null);

  const touchStart = () => {
    timerRef.current = setTimeout(() => {
      setIsLongPress(true);
    }, 500);
  };

  const touchEnd = () => {
    clearTimeout(timerRef.current);
    if (isLongPress) {
      // 长按事件处理
      console.log('Long press triggered!');
    } else {
      // 短按事件处理
      console.log('Short press triggered!');
    }
    setIsLongPress(false);
  };

  const touchMove = () => {
    clearTimeout(timerRef.current);
    setIsLongPress(false);
  };

  useEffect(() => {
    return () => {
      // 组件卸载时清除定时器
      clearTimeout(timerRef.current);
    };
  }, []);

  return (
    
  );
}

export default LongPressButton;

这里使用了 useState 来管理长按状态,useRef 来保存定时器,useEffect 来处理组件卸载时的清理工作。

长按事件与其他手势事件(如滑动、缩放)冲突时,如何处理?

处理手势冲突是个复杂的问题,没有银弹。一般来说,需要根据具体场景来判断优先级。

一种常见的做法是,在 touchstart 时记录初始状态,然后在 touchmove 时判断是滑动还是长按。如果是滑动,就取消长按事件;如果是长按,就阻止滑动事件。

另外,还可以使用一些手势识别库,比如 Hammer.js,来简化手势识别的流程。这些库通常会提供一些 API 来处理手势冲突。

总而言之,处理手势冲突的关键在于:

  1. 明确各种手势的优先级。
  2. 在 touchmove 事件中进行判断和处理。
  3. 使用手势识别库来简化开发。

记住,没有万能的解决方案,需要根据实际情况进行调整。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

514

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

244

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5306

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

481

2023.09.01

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

Js中concat和push的区别
Js中concat和push的区别

Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

218

2023.09.14

js截取字符串的方法介绍
js截取字符串的方法介绍

JavaScript字符串截取方法,包括substring、slice、substr、charAt和split方法。这些方法可以根据具体需求,灵活地截取字符串的不同部分。在实际开发中,根据具体情况选择合适的方法进行字符串截取,能够提高代码的效率和可读性 。

219

2023.09.21

clawdbot ai使用教程 保姆级clawdbot部署安装手册
clawdbot ai使用教程 保姆级clawdbot部署安装手册

Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

13

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 7.4万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 1.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号