fastclick简介

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

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

fastclick的原理大致如下:

  1. 监听touchend事件,在touchend时调用event.preventDefault()禁用300ms后触发默认的click事件;
  2. 通过document.createEvent手动创建一个鼠标事件对象;
  3. 再通过eventTarget.dispatchEvent将click事件手动派发到当前目标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. mac OS nvm 常用命令

    nvm install stable ## 安装最新稳定版 node,当前是node v10.15.0 (npm v6.4.1) nvm install <version> ## 安装指定 ...

  2. 【摘抄】深入解析Windows操作系统

    一.线程是一个进程内部的实体,也是Windows执行此进程时的调度实体.若没有线程,进程的程序将不可能运行.线程包含以下部件: 1.一组代表处理器状态的CPU寄存器中的内容. 2.两个栈:一个用于线程 ...

  3. Java笔记(day13)

    多线程: 进程:正在进行中的程序(直译) 线程:执行路径,就是进程中负责程序执行的控制单元(执行路径): 一个进程中可以多个路径,称为多线程 一个进程至少一个线程 每一个线程都有自己运行的内容,这个内 ...

  4. Linux之《荒岛余生》(一)准备篇

    xin片之争,已经暴露了中国xin的问题,我等码农束手无策:而在操作系统方面,成果也是乏善可陈:现如今酷炫的Web监控工具,让很多研发丧失了真正处理问题的能力. 越接近底层,就越接近真相,在计算机的世 ...

  5. 自动化运维工具Ansible之Tests测验详解

    Ansible Tests 详解与使用案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: 3. 该用 ...

  6. matlab数值数据和变量名

    1.2MATLAB数值数据 l  数值数据类型的分类 l  数值数据的输出格式 l  常用数学函数内部函数 1.数值数据类型的分类 l  整型 l  浮点型 l  复数型 (1)整型 1.数值数据类型 ...

  7. 借助DEM生成高精度SketchUp地形,地形分析如此简单

    SketchUp因其自身友好的界面和强大的功能,已经成为建筑规划设计常用工具.无论是摩天大楼还是独栋别墅,小区规划还方案推敲和方案表现上都显示出了不错的实力. 然而SketchUp异形建模能力对比3d ...

  8. 深度剖析西门子PLC的开放式TCP通信

    对于自控或电气工程师来说,西门子PLC是每个人都非常熟悉的一款PLC品牌:而对于上位机开发工程师来说,Socket通信或TCP/IP协议也是必须要掌握的一种通信方式.刚好手头有一款西门子的200Sma ...

  9. 一阶RC高通滤波器详解(仿真+matlab+C语言实现)

    文章目录 预备知识 关于电容 HPF的推导 simulink 仿真 simulink 运行结果 matlab 实现 matlab 运行结果 C语言实现 如果本文帮到了你,帮忙点个赞: 如果本文帮到了你 ...

  10. 写ssm项目的注意点

    注意事项: 输出台乱码 a链接以post提交 表单提交前验证 onsubmit 属性在提交表单时触发. onsubmit 属性只在 中使用. <form action="/demo/d ...