fastclick简介

fastclick是一款为了解决移动端300ms点击延迟而诞生的插件。

在移动端,如果对页面没有做任何处理,点击一个元素,触发的事件流程可简单理解为:touch -> 经过300ms延迟 -> click

fastclick的原理大致如下:

  1. 监听touchend事件,在touchend时调用event.preventDefault()禁用300ms后触发默认的click事件;
  2. 通过document.createEvent手动创建一个鼠标事件对象;
  3. 再通过eventTarget.dispatchEventclick事件手动派发到当前目标DOM元素上。

细数fastclick的多宗罪

实际上fastclick目前存在非常多的bug,距离上一次更新已经是五年前了。

但是每周在npm仍然有数以万计的人在下载并使用它。

就目前而言,我使用fastclick遇到的问题如下:

  • 移动端点击input不灵敏,需要点击很多次才有反应
  • 调起手机原生软键盘卡、慢
  • 点击穿透
  • 点击错位(点了A,触发了B)

移动端300ms延迟的前世今生

移动端点击,触发click事件存在300ms延迟”,这句话在前端圈广为流传,似乎大家都默认了这一现象确实存在,在注重移动端用户体验的今天,300ms的延迟变得不可接受,要解决这个问题,靠啥?靠插件呗。网上一搜,大家都用fastclick。所以,你也不管三七二十一,用上了fastclick。

让我们回到300ms延迟本身,探究一下300ms延迟为何会存在。

在2007年,首款iPhone发布之前,遇到了这样一个问题,通过iPhone上网,浏览的网页基本是这样的:

在十几年前,当时的网页基本上都是为PC设备所设计的,没有什么移动端适配的概念,导致字体看起来非常小,阅读困难。

为了处理这种情况,苹果的工程师们想了各种应对方案,其中最为出名的,当属双击缩放(double tap to zoom)。通过双击,在放大比例和原始比例之间进行切换。

如果判断用户是点击还是双击呢?苹果的逻辑如下:

在用户点击完此处第一次后,如果300ms内没有在此处进行第二次点击,就认为是一个纯点击操作。

这就是300ms延迟的来源,浏览器通过300ms的时间间隔猜测你的行为意图,试图分辨你是想单击还是双击。

如何解决

既然浏览器对于单击还是双击存在一个判断逻辑,那么我们只需要告诉浏览器:“不用猜了,我只是想单击而已,压根我就没想进行什么双击缩放”,那么浏览器自然就会乖乖地把这个无谓的行为监测时间间隔给移除。

好了,如何告知呢?我们直接引用fastclick在npm官方地址中的一句话

其意为:在chrome32+(2014年发行)的浏览器版本中,如果viewport meta标签设置了布局视口的宽度等于理想视口的宽度,那么,就相当等于告知浏览器:“我这个网页是专门针对移动端做过适配的,不是那种字跟蚂蚁一样大小的网页,所以,我不需要双击缩放这种操作,赶紧把300ms延迟给我关了”。

如果我们设置user-scalable=no,相当等于斩钉截铁地告诉浏览器:“我这网页已经完全没有缩放可言”,浏览器收到指示,不止在chrome32+的版本,在所有的版本中都会移除300ms延迟。

除了chrome32+,其他诸如firefox,IE/Edge等等主流浏览器均在2014年-2015年年做了跟进,相继修复了这个问题。

而作为始作俑者的iOS,在2016年3月发布的iOS9.3中,也修复了这个问题。

不过要注意⚠️,现在的webview开发(确切来说是iOS8以后),绝大部分iOS的WebView版本都会选用WKWebView,在WKWebView中,300ms延迟的问题已经得到解决,但是之前的老式UIWebView中这个问题仍然存在。实际上,UIWebView不仅存在不少bug,官方也放弃对其进行维护,并强烈推荐开发者使用WKWebView进行开发。

fastclick从接触到丢弃的更多相关文章

  1. 关于fastclick.js

    Fastclick fastclick.js解决了什么问题? 自己接触WebApp开发的前期, 总感觉WebApp上的按键操作不如NativeApp的灵敏, 好像有那么一小点延迟. 后来才知道, 这是 ...

  2. zepto中的touch库与fastclick

    1. touch库实现了什么和引入背景 click事件在移动端上会有 300ms 的延迟,同时因为需要 长按 , 双触击 等富交互,所以我们通常都会引入类似 zepto 这样的库.zepto 中tou ...

  3. FastClick

    处理移动端click事件300毫秒延迟.FastClick 是一个简单,易于使用的js库用于消除在移动浏览器上触发click事件与一个物理Tap(敲击)之间的300延迟. 1.为什么会延迟? 从点击屏 ...

  4. fastclick源码分析

    https://www.cnblogs.com/diver-blogs/p/5657323.html  地址 fastclick.js源码解读分析 阅读优秀的js插件和库源码,可以加深我们对web开发 ...

  5. fastclick.js源码解读分析

    阅读优秀的js插件和库源码,可以加深我们对web开发的理解和提高js能力,本人能力有限,只能粗略读懂一些小型插件,这里带来对fastclick源码的解读,望各位大神不吝指教~! fastclick诞生 ...

  6. [C#] 走进异步编程的世界 - 开始接触 async/await

    走进异步编程的世界 - 开始接触 async/await 序 这是学习异步编程的入门篇. 涉及 C# 5.0 引入的 async/await,但在控制台输出示例时经常会采用 C# 6.0 的 $&qu ...

  7. FastClick 填坑及源码解析

    最近产品妹子提出了一个体验issue —— 用 iOS 在手Q阅读书友交流区发表书评时,光标点击总是不好定位到正确的位置: 如上图,具体表现是较快点击时,光标总会跳到 textarea 内容的尾部.只 ...

  8. 【读fastclick源码有感】彻底解决tap“点透”,提升移动端点击响应速度

    申明!!!最后发现判断有误,各位读读就好,正在研究中.....尼玛水太深了 前言 近期使用tap事件为老夫带来了这样那样的问题,其中一个问题是解决了点透还需要将原来一个个click变为tap,这样的话 ...

  9. 刚接触Linux,菜鸟必备的小知识点(一)

    身为一个将要大四的学生,而且还是学计算机的没有接触过linux简直是羞愧难当.这个假期做了一个软件测试员,必须要熟悉linux的操作,所以对于我这个菜鸟我也就说几点比较重要的小知识点吧. 第一.cd指 ...

随机推荐

  1. Ubuntu 14.04 配置samba

    Ubuntu 14.04 配置samba: 安装略 # vi /etc/samba/smb.conf security = user  (在[global]下任意添加) [share] path = ...

  2. spring mvc从前台往后台传递参数的三种方式

     jsp页面: 第一种:使用控制器方法形参的方式(常用) 第二种:使用模型传参的方式(如果前台往后台传递的参数非常多,如果还使用形参的方式传递,非常复杂.我们可以使用模型传参的方式,把多 个请求的参数 ...

  3. Numpy-np.random.normal()正态分布

    X ~ :随机变量X的取值和其对应的概率值P(X = ) 满足正态分布(高斯函数) 很多随机现象可以用正态分布描述或者近似描述 某些概率分布可以用正态分布近似计算 正态分布(又称高斯分布)的概率密度函 ...

  4. LabVIEW(数据库自动编号)

    数据库如果字段是自动编号,则在插入数据时,可以不考虑.

  5. [hdu4631 Sad Love Story]最近点对,枚举

    题意:S是平面内点的集合,初始为空,每次向集合里面加入一个点P(x,y),询问S内最近点对的距离的平方和 思路:设当前集合的答案为D,则找到集合里面横坐标在(x-√D,x+√D)内的数,用它们来更新答 ...

  6. activiti工作流入门学习

    工作流一般在OA系统用的比较多,当然,只要有流程审批的地方都会用到,activiti只是开源的工作流中比较流行的一个,还有其他的开源的工作流,这里学习activiti工作流:前面部分是关于activi ...

  7. vtk学习记录(三)——初识vtkRenderer

    目录 前言 vtkRenderer 引入vtk窗口 小结 前言 一场疫情打乱了好多人的节奏,我也一样,一不留神半年都快过去了,这期间虽说一直在鼓捣东西吧,不过确实是没啥实质性的进展,索性就继续把vtk ...

  8. Jmeter简单性能测试练习

    项目描述: 被测网站:xqtesting.blog.51cto.com 指标:响应时间以及错误率 场景:线程数20   测试步骤: 测试计划 线程组 http请求 监听器 运行脚本 查看报告 1.添加 ...

  9. java 版本比较

    public class version { public static int compareVersion(String version1, String version2) throws Exc ...

  10. 使用python对oracle进行简单性能测试

    一.概述 dba在工作中避不开的两个问题,sql使用绑定变量到底会有多少的性能提升?数据库的审计功能如果打开对数据库的性能会产生多大的影响?最近恰好都碰到了,索性做个实验. sql使用绑定变量对性能的 ...