当前位置: 首页 > news >正文

移动端h5页面click事件延迟300ms,出现该问题的原因分析及解决方案FastClick.js

内容参考来源:https://www.cnblogs.com/zhaodahai/p/6831165.html

不管在移动端还是PC端,我们都需要处理用户点击,这个最常用的事件。但在touch端click事件响应速度会比较慢,在较老的手机设备上会更为明显(300ms的延迟)。

问题由来:

这要追溯至 2007 年初。苹果公司在发布首款 iPhone 前夕,遇到一个问题:当时的网站都是为大屏幕设备所设计的。于是苹果的工程师们做了一些约定,应对 iPhone 这种小屏幕浏览桌面端站点的问题。

这当中最出名的,当属双击缩放(double tap to zoom),这也是会有上述 300 毫秒延迟的主要原因。双击缩放,顾名思义,即用手指在屏幕上快速点击两次,iOS 自带的 Safari 浏览器会将网页缩放至原始比例。

那么这和 300 毫秒延迟有什么联系呢?

假定这么一个场景。用户在 iOS Safari 里边点击了一个链接。由于用户可以进行双击缩放或者双击滚动的操作,当用户一次点击屏幕之后,浏览器并不能立刻判断用户是确实要打开这个链接,还是想要进行双击操作。因此,iOS Safari 就等待 300 毫秒,以判断用户是否再次点击了屏幕。

鉴于iPhone的成功,其他移动浏览器都复制了 iPhone Safari 浏览器的多数约定,包括双击缩放,几乎现在所有的移动端浏览器都有这个功能。之前人们刚刚接触移动端的页面,在欣喜的时候往往不会care这个300ms的延时问题,可是如今touch端界面如雨后春笋,用户对体验的要求也更高,这300ms带来的卡顿慢慢变得让人难以接受。

那么我们该如何解决这个问题,可能有的同学会想到touchstart事件,这个事件响应速度很快啊,如果说开发的界面上面可点击的地方很少,要么用户滑动下手指就触发touchstart事件,也会让人崩溃的。大家可以参考如下的几种方法。

粗暴型:禁用缩放

关键是 user-scalable = no。 这个属于简单粗暴型的,虽然看似完美,但有一个致命的缺陷,当你必须完全禁用缩放来达到目的时候,就傻眼了,只有特定场景下的交互界面,此方案才可行,其它大多数情况,此法都不可行。 另外:Chrome 开发团队不久前宣布,在 Chrome 32 这一版中,他们将在包含 width=device-width 或者置为比 viewport 值更小的页面上禁用双击缩放。当然,没有双击缩放就没有 300 毫秒点击延迟。

指针事件 (Pointer Events)

指针事件最初由微软提出,现已进入 W3C 规范的候选推荐标准阶段 (Candidate Recommendation)。这个草案规范旨在使用一个单独的事件模型,对所有输入类型,包括鼠标 (mouse)、触摸 (touch)、触控 (stylus) 等,进行统一的处理。

比如用css设置-ms-touch-action: none,那么对应的元素在被点击之后,浏览器不会启动缩放操作,也就避免了这个300ms延迟,但目前只有IE10+支持,目前touch开发的重点在safari和chrome,因此你懂的,此方案目前兼容性不好,不过chrome表示会在未来版本中支持的。

指针事件 (使非IE也支持)

上面也说道touch-action: none是一个办法,那么其它浏览器不支持怎么办呢?下面的几个类库是关于这方面的,感兴趣的可以去研究下:

1.Google的Polymer
2.微软的 HandJS
3.@Rich-Harris 的 Points

touch-action: none这种方案虽然可以解决这个问题,但影响的面比较广,不是单纯的来解决300ms延时问题的,有可能会带来性能和其它操作上的隐患,慎用。

FastClick.js:闪亮登场

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

FastClick 的使用方法非常简单,在 window load 事件之后,在body上调用FastClick.attach()即可。FastClick.js可以自己在网上搜,一大堆。

window.addEventListener( “load”, function() {
FastClick.attach( document.body );
}, false );
attach方法虽可在更具体的元素上调用,直接绑定到body上可以确保整个应用都能受益。当 FastClick 检测到当前页面使用meta设置了user-scalable=no或者 touch-action 属性的解决方案时,会静默退出。可以说,这是真正的跨平台方案出来之前一种很好的变通方案。

就目前而言,FastClick 非常实际地解决 300 毫秒点击延迟的问题,唯一的缺点可能也就是该脚本的文件尺寸 (尽管它只有10kb)。如果你连这10kb都接受不了的话,那么移动端类库 jQuery和zepto.js都支持tap事件来解决这个问题,尽管它们的响应速度比FastClick慢一些。

正是因为有这些解决方案,那么首先还是挑选眼前更合适的吧,毕竟以后会不会出新标准来解决这个问题,谁都不知道,理论上来说FastClick也是属于替代方案,希望有一天touch 端的开发可以不走pc的路,让本来都苦逼的前端雪上加霜。

相关文章:

  • ios移动端兼容:iPhone X等机型底部的安全距离样式的设置
  • js简单判断:js判断对象是否为{},js判断对象是否为null
  • Linux Pmap 命令:查看进程用了多少内存
  • HBuilder X运行uniapp之app真机调试控制台console不打印,多种原因分析解决,亲测有效
  • 开源项目推荐:推荐5款前端的开源项目,vue、uniapp、react学无止境用无止境_
  • uniapp插件开发:uniapp之slider滑动选择插件,方向支持横向和竖向,更多参数可配置化
  • 与 ConTeXt MkIV 官方文档的接驳
  • uniapp插件开发:uniapp使用uni_modules开发插件、发布插件,直接导入,一键升级
  • 小程序跳转:小程序之间的跳转详细步骤(公众号绑定小程序、wx.navigateToMiniProgram实现跳转)
  • JAVA调用DLL使用JNA详细说明实例
  • 小程序跳转:云开发之h5跳小程序
  • 使用系统的CoreLocation定位
  • 小程序跳转:云开发H5跳转小程序的坑,微信可跳,H5无法跳
  • FLAG是什么公司
  • 小程序跳转:h5避免中间页直接打开微信小程序
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • extjs4学习之配置
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JS学习笔记——闭包
  • leetcode-27. Remove Element
  • Vue 动态创建 component
  • Vue.js 移动端适配之 vw 解决方案
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 复杂数据处理
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 探索 JS 中的模块化
  • 责任链模式的两种实现
  • 找一份好的前端工作,起点很重要
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • #define与typedef区别
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (2020)Java后端开发----(面试题和笔试题)
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (二)丶RabbitMQ的六大核心
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)计算机毕业设计大学生兼职系统
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)Unity3DUnity3D在android下调试
  • (转载)Linux网络编程入门
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .net(C#)中String.Format如何使用
  • .Net(C#)自定义WinForm控件之小结篇
  • .net的socket示例
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET实现之(自动更新)
  • .NET中两种OCR方式对比