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. 基于opencv的人脸识别程序

    1. 解析opencv自带人脸识别源码(……/opencv-3.1.0/samples/cpp/facedetect.cpp) @ 操作系统:Ubuntu 15.04 OpenCV版本:3.1.0 # ...

  2. 数学--数论--随机算法--Pollard Rho 大数分解算法(纯模板带输出)

    ACM常用模板合集 #include <bits/stdc++.h> using namespace std; typedef long long ll; ll pr; ll pmod(l ...

  3. 将A页面提交的数据id传递到B页面

    A页面 在A页面跳转到B页面的时候,在url后面可以拼接参数 例如: window.location.href = './B.html?' + id; 跳转到B页面之后,可以通过url地址获取到从A页 ...

  4. vue element select多选回显

    我们经常在使用 Element组件里面的 select多选 场景:添加账号的时候需要选择可见分公司(分公司为多选),添加成功之后可以编辑,需要回显添加时所提交的分公司 代码如下: 多选框: data( ...

  5. libevent(二)尾队列 && 最小堆

    本文主要研究libevent中用来存储事件的两个结构体. 尾队列 具体定义位于queue.h中. #define TAILQ_HEAD(name, type) \ struct name { \ st ...

  6. C++关闭同步流 ios::sync_with_stdio(false)

    说明:ios::sync_with_stdio(false) 1.这句语句是用来取消cin的同步,什么叫同步呢?就是iostream的缓冲跟stdio的同步.这就是为什么cin和cout比scanf和 ...

  7. 循环结构(for、while)

    3.4用for语句实现循环结构 什么是循环结构 for语句 1.什么是循环结构? 循环结构又称为重复结构,是利用计算机运算速度快以及能进行逻辑控制的特点来重复执行某些操作.重复执行的部分称为循环体. ...

  8. TD-LTE华为 DBS3900数据配置实践 典型案例

    案例:华为 DBS3900 双基站二扇区配置(同频切换) 一.数据配置前的硬件准备: HW-DBS3900: (1#基站名称) FAN (风扇),安装在 16#槽位: LBBP (基带处理单板),安装 ...

  9. 【HBase】通过Java代码实现HBase数据库中数据的增删改查

    目录 创建maven工程,导入jar包 java代码实现创建hbase表 java代码实现向hbase表中插入数据 java代码查询hbase数据 使用rowKey查询指定列族指定列的值 通过star ...

  10. JUC之ReentrantLock源码分析

    ReentrantLock:实现了Lock接口,是一个可重入锁,并且支持线程公平竞争和非公平竞争两种模式,默认情况下是非公平模式.ReentrantLock算是synchronized的补充和替代方案 ...