移动端点击(click)事件延迟问题的解决方法

2023-11-15

移动端 click 事件会有 300ms 的延时,原因是移动端屏幕双击会缩放(double tap to zoom) 页面。

解决方案:

1. 禁用缩放: 浏览器禁用默认的双击缩放行为并且去掉300ms 的点击延迟。

  <meta name="viewport" content="user-scalable=no">

2.利用touch事件自己封装这个事件解决300ms 延迟。

原理就是:

当我们手指触摸屏幕,记录当前触摸时间

当我们手指离开屏幕, 用离开的时间减去触摸的时间

如果时间小于150ms,并且没有滑动过屏幕, 那么我们就定义为点击

代码如下:

//封装tap,解决click 300ms 延时
function tap (obj, callback) {
        var isMove = false;
        var startTime = 0; // 记录触摸时候的时间变量
        obj.addEventListener('touchstart', function (e) {
            startTime = Date.now(); // 记录触摸时间
        });
        obj.addEventListener('touchmove', function (e) {
            isMove = true;  // 看看是否有滑动,有滑动算拖拽,不算点击
        });
        obj.addEventListener('touchend', function (e) {
            if (!isMove && (Date.now() - startTime) < 150) {  // 如果手指触摸和离开时间小于150ms 算点击
                callback && callback(); // 执行回调函数
            }
            isMove = false;  //  取反 重置
            startTime = 0;
        });
}
//调用  
  tap(div, function(){   // 执行代码  });

3、使用插件:fastclick 插件解决300ms 延迟。

GitHub官网地址: https://github.com/ftlabs/fastclick  

FastClick 是 FT Labs 专门为解决移动端浏览器 300 毫秒点击延迟问题所开发的一个轻量级的库。简而言之,FastClick 在检测到touchend事件的时候,会通过 DOM 自定义事件立即触发一个模拟click事件,并把浏览器在 300 毫秒之后真正触发的click事件阻止掉。使用方法如下。      

第一步:在页面中引入fastclick.js文件。      

第二步:在js文件中添加以下代码      在 window load 事件之后,在body上调用FastClick.attach()即可。

window.addEventListener(function(){   
    FastClick.attach( document.body );  
},false );

 如果你项目使用了JQuery,就将上面的代码改写成:

$(function() {    
    FastClick.attach(document.body);    
});  

4、使用 touchend 事件处理

不同于 click 和 touchstart,touchend 没有这个 300ms 的延迟,而是即时触发,你完全可以在 WebGL 或 canvase 游戏中进行实践,但是在web 页面中单单使用 touchend 并不一定靠谱.

1、如果用户在两个不同元素之间触发了 touchstart 和touchend,那么 click 不会被触发 .

2、如果用户触发了 touchstart,但是在touchend之前是一个长长的 touchmove 滚动, 那么 click 也不会被触发.

3、在站点上任然应该保留 click 事件以兼容那些非触摸设备,这是你就要考虑事件的重复触发问题.

在此处输入内容已有同行为我们封装了部分解决方法:

   1、FastClick 来至于FT实验室的一个插件,仅仅只有10kb,但是能解决上面的2-4步.

   2、Tappy 来自于Filament Group,仅仅1kb,概念上类似于上面的指针事件.问题:当你为多个元素进行这些事件绑定时,有可能出现性能的损耗.是否有完美的解决方案呢?


是否需要解决 300ms 在于自己的判断,300ms被设计出来是有特定的用途,上面的meta属性中进行了设定,在chrome和firefox下能起作用,希望其他厂商也能尽 快提供这类支持。touch-action: manipulation 这个css属性能把风险降到最低,虽然现在只有微软支持,但是作为W3C规范和HTML5test的一部分,因此也许我们并不需要等待太久。

原文链接:https://blog.csdn.net/qappleh/article/details/80419204


 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

移动端点击(click)事件延迟问题的解决方法 的相关文章

  • Sequelize.js 中的自定义或覆盖连接

    我需要使用创建自定义连接条件Sequelize js http sequelizejs com使用 MSSQL 具体来说 我需要加入TableB基于一个COALESCE中的列的值TableA and TableB并最终得到这样的连接条件 L
  • 在 Javascript 中本地化字符串

    我目前正在使用 resx文件来管理我的 NET 服务器端资源 我正在处理的应用程序还允许开发人员将 JavaScript 插入各种事件处理程序中以进行客户端验证等 对我来说本地化 JavaScript 消息和字符串的最佳方法是什么 理想情况
  • 使用 requirejs 加载外部脚本而无需访问配置

    我正在尝试在我正在编写的插件中加载数据表 javascript 库 问题是 当我加载外部资源时 我会遇到冲突 因为当我调用 require 时 数据表与某些内容发生冲突 这是错
  • 有没有办法监控页面上运行的 JavaScript 函数?

    有没有办法查看页面上正在执行哪些功能 如果我在页面上加载外部脚本 是否可以动态更改函数的功能或阻止其运行 HTML5 http www w3 org TR html5 scripting 1 html establish script bl
  • 动态表中每个按钮的 Jquery-Ui 对话框表单

    我正在生成一个 HTML 表 每行都有一个按钮 必须打开 Jquery ui 对话框表单 The table table class table table reporting table condensed table striped t
  • javascript 和 PHP 中的正则表达式有什么区别吗?

    这是在 javascript 中验证电子邮件地址的正则表达式 我不确定是否可以直接在 PHP 中使用它 a z d u00A0 uD7FF uF900 uFDCF uFDF0 uFFEF a z d u00A0 uD7FF uF900 uF
  • 夜间值班。单击带有文本的元素

    我遇到问题 无法单击具有某些独特文本的网页元素 我有这样的结构 div class wg wagon type title Text div 我试试这个 click wg wagon type title contains Text 但我有
  • 如何为 HTML5 音频元素制作加载栏?

    我正在尝试为 HTML5 音频元素制作一个加载栏 显示加载 缓冲的百分比 对于视频标签 可以使用以下方法进行计算 video buffered end 0 video duration 但我无法让它与音频标签一起使用 它只是返回一个固定值
  • Nodemailer:从未收到问候语

    当尝试使用 Nodemailer 在 Node 内发送电子邮件时 https github com nodemailer nodemailer https github com nodemailer nodemailer 调用sendMai
  • 在 JavaScript 中定位提示弹出窗口

    我有一个如下所示的 JavaScript 提示 我想将提示放在屏幕中心 如何使用 javascript 做到这一点 function showUpdate var x var name prompt Please enter your na
  • 在 IE10 中禁用捏合放大

    在 IE10 触摸模式下 我希望仅使页面的特定部分可缩放 其余的不应该 我找到了这个 http msdn microsoft com en US library ie hh772044 aspx http msdn microsoft co
  • 改进 D3 序列旭日示例

    This D3示例作为我的出发点 http bl ocks org kerryrodden 7090426 http bl ocks org kerryrodden 7090426 我想更改提供图表的数据 并且我做了以下新示例 http j
  • Rails 递归地包含 javascripts 资源文件夹

    我了解如何将一个 JavaScript 文件添加到 Rails 资产管道中 只需添加 require filename 到 application js 但是如何在一个文件夹下包含多个 javascript 文件 vendor assets
  • 从网站存储数据的最简单方法(在服务器端)

    我有一个非常简单的网站 实际上是单页 有一个输入字段和一个按钮 我需要将用户提交的数据存储在服务器端的某个位置 完美的方法可能是简单的文本文件 并在每次单击按钮后附加新行 日志文件也可以 据我了解 JavaScript 本身是不可能的 我在
  • 在 HTML5 中将两个图像合并到一个画布上

    我正在使用 HTML5 canvas 元素 假设我有 2 个 ImageData 对象 我想将它们组合起来放在一张画布上 假设我不关心这些图像如何组合 两个 ImageData 对象具有完全相同的像素数和形状 组合两个图像的最佳方式是什么
  • 无法在渲染器进程中使用 Node.js API

    无法在 Electron 中使用任何与 Electron 或节点相关的操作 未定义获取错误过程 我检查了他们指导添加节点支持的各个地方 但这已经完成了 所以卡在这里 我的主要应用程序代码是 const electron require el
  • 浏览器默认区域设置 - Intl.DateTimeFormat 与 navigator.language

    在对网站进行编码并格式化日期时 我想使用用户在浏览器中设置的区域设置 例如 如果用户定制了他们的chrome settings languages在 Chrome 中设置为非默认值 这就是我想要使用的值 但是 当我在此类浏览器的控制台中运行
  • 如何修复 getImageData() 错误画布已被跨源数据污染?

    我的代码在本地主机上运行得很好 但在网站上却不起作用 我从控制台收到此错误 对于这一行 getImageData x y 1 1 data Uncaught SecurityError Failed to execute getImageD
  • Angular 2访问组件内的ng-内容

    我怎样才能访问 content 来自组件类本身的组件 我想做这样的事情
  • 使用 JQuery 预填充选择字段的下拉选项验证

    我有这个 JQuery 片段来防止选择已在另一个字段中选择的下拉选项 var coll select name service on change function coll each function var val this value

随机推荐

  • 《Thinking in Java》——构造器是private时如何创建对象?

    构造器是private时如何创建对象 可以通过static成员进行创建 如 class A private A 构造器是private修饰 不能在本类外通过new A 创建对象 public static A construct retur
  • Inno Setup 制作安装程序[支持静默安装.NET环境]

    1 贴源码 脚本由 Inno Setup 脚本向导 生成 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档 define MyAppName TestSet define MyAppVersion 1 0 define My
  • Linux系统故障排查和修复技巧

    一 单用户模式 Linux系统提供了单用户模式 类似Windows安全模式 可以在最小环境中进行系统维护 在单用户模式 运行级别1 中 Linux引导进入根shell 网络被禁用 只有少数进程运行 单用户模式可以用来修改文件系统损坏 还原配
  • SpringBoot通过注解的方式调用Quartz定时任务

    1 引入Quartz依赖 2 SpringBoot启动类增加 EnableScheduling注解 3 创建一个定时任务工作类在方法 代码如下 package com jlzh lftwebservice service quartz im
  • CSS进阶 —— 10 分钟理解 BFC 原理

    未完待续
  • 幻想乡的日常【树状数组+离线操作】

    题目链接 给出N个点的树 编号为1 N 每次的查询为 L R 想知道编号在 L R 内的所有的结点的会被分成多少个连通块 给出一条性质 连通块数量 点数 边数 点数很方便的可以计算 就是 R L 1 那么 如何计算边数呢 我们知道 每条边有
  • 这届世界杯是不是让你出乎意料?写个足球小游戏来模拟一下!

    前言 今年世界杯有人欢喜有人愁 我想愁的人应该居多 不得不说 小日本是真菜啊 特么的 今天还是搞点咱们好玩点的 世界杯嘛 大家看看就行 大家不是都说 看国足比看相声还搞笑吗 好了 不笑了 今天给大家带来一款非常简单的足球小游戏 希望大家喜欢
  • 什么是分布式软件系统

    什么是分布式软件系统 分布式软件系统是什么意思 分布式软件系统 Distributed Software Systems 是支持分布式处理的软件系统 是在由通信网络互联的多处理机体系结构上执行任务的系统 它包括分布式操作系统 分布式程序设计
  • 精灵标注助手的安装及使用

    位置标注 分割标注 官网下载安装包 http www jinglingbiaozhu com 安装超简单 位置标注 新建 gt 位置标注 gt 选择图片文件夹 定义分类值 用英文逗号隔开 然后 创建 右下角的 可以对图片进行放大 缩小 选择
  • jenkins配置publish over ssh遇到的问题

    一 背景 目标 本篇文章主要是说明自己在配置jenkins的publish over ssh插件所遇到的问题 本次主要是windows下的jenkins通过ssh的方式访问我本地虚拟机的ubuntu系统 准备 1 在jenkins上安装pu
  • [python] Python类型提示指北

    Python3 5 版本引入了类型提示 Type Hints 它允许开发者在代码中显式地声明变量 函数 方法等的类型信息 这种类型声明不会影响 Python 解释器的运行 但可以让 IDE 和静态分析工具更好地理解代码 同时提高代码的可读性
  • MySQL——SQL注入问题

    文章目录 1 SQL注入问题 2 PreparedStatement对象 1 SQL注入问题 SQL存在漏洞 会被攻击导致数据泄露 2 PreparedStatement对象 PreparedStatement 可以防止SQL注入 效率更好
  • vue使用文件流和url下载文件

    改为使用后台返回url下载文件 方法1 这个会导致在点击下载按钮的时候 页面会跳转到奇怪的url window location href row downloadUrl 方法2 点击下载按钮 不会在新窗口打开 const download
  • 刷脸支付算法和硬件不断升级消费更有保障

    刷脸支付设备依靠3D传感摄像头进行人脸识别 其内置的点阵投影仪可以投射出3万多个肉眼不可见的红外点到用户脸部 多维度 多角度在颜色 纹理 深度等数据进行高层次对比 安全性和精准性更高 识别速度更快 尽管现在刷脸支付的安全性已经达到极高的金融
  • 【数据结构与算法】栈的实现(附源码)

    目录 一 栈的概念和结构 二 接口实现 A 初始化 Stackinit 销毁 Stackdestroy 1 Stackinit 2 Stackdestroy B 插入 Stackpush 删除 Stackpop 1 Stackpush 2
  • 接口未正确配置:wx.getLocation(暂无权限)

    原因 腾讯地理位置接口新增与相关流程 地理位置接口新增说明 由于精确地理位置接口只允许部分类目的小程序申请使用 为了满足开发者在更多场景使用地理位置接口 自 2022 年 7 月 14 日起 新增获取模糊地理位置接口 wx getFuzzy
  • 计算机网络第六章——应用层(下)

    等闲变却故人心 却道故人心易变 文章目录 用户代理就是用户和电子邮件系统之间的一个接口 通常都是运行在电脑中的一个程序 用户代理又可以称为电子邮件客户端软件 用户代理可以为用户提供一个比较友好的接口 邮件服务器作为一个服务器就需要长时间的工
  • 责任链模式(Chain of Responsibility) Java实现

    责任链模式 责任链模式 Chain of Responsibility 定义 责任链模式是一种对象的行为模式 在责任链模式里 很多对象由每一个对象对其下家的引用而连接起来形成一条链 请求在这个链上传递 直到链上的某一个对象决定处理此请求 发
  • 以太网(Ethernet)相关基础知识

    最近正好在学习以太网 感觉非常有用 进行一个总结 欢迎指正 如今 以太网已在现实中大量使用 低廉的价格和较快的速度都是它从许多网络中存活下来的因素 学校 公司中大多用得都是以太网 目录 以太网电缆 Ethernet Cabling 曼彻斯特
  • 移动端点击(click)事件延迟问题的解决方法

    移动端 click 事件会有 300ms 的延时 原因是移动端屏幕双击会缩放 double tap to zoom 页面 解决方案 1 禁用缩放 浏览器禁用默认的双击缩放行为并且去掉300ms 的点击延迟 2 利用touch事件自己封装这个