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. mac OS 配置 svn服务器端

    在Windows环境下 一般使用Tortoise SVN来搭建svn环境 操作系统 mac OS High Sierra 10.13.6 在Mac环境下 由于Mac自带了svn的服务器端和客户端功能 ...

  2. 关于SpringBoot集成myBatis时,mapper接口注入失败的问题

    问题描述: 在Spring Boot集成myBatis时,发现启动时,mapper接口一直注入失败. 现象如下: VehicleDAO就是需要的mapper对象,一个简单的接口. 已经在applica ...

  3. flask学习笔记(二)

    一.视图函数的传参方式 修改前: 目标: 传参方式改成 途径: 通过request获取参数 注意:args并不是地点类型,而是dict的一个子类,如图: immutable意思是不可变 不可变的字典转 ...

  4. USACO Training Section 1.2 [USACO1.2]回文平方数

    题目描述 回文数是指从左向右念和从右向左念都一样的数.如12321就是一个典型的回文数. 给定一个进制B(2<=B<=20,由十进制表示),输出所有的大于等于1小于等于300(十进制下)且 ...

  5. Codeforce 1251C. Minimize The Integer

    C. Minimize The Integer time limit per test2 seconds memory limit per test256 megabytes inputstandar ...

  6. ubuntu 使用 vsftpd 基于系统用户配置相互隔离的 ftp (ftps) 服务

    我们在日常使用 UbuntuServer 服务器时,经常会直接使用基于 ssh 的  sftp 连接服务器直接进行文件上传和下载,不过这个方式其实有一定的安全隐患,当一个团队有多个人员,需要连接服务器 ...

  7. springboot利用redis实现分布式锁(redis为单机模式)

    1.pom文件添加redis支持 <dependency> <groupId>org.springframework.boot</groupId> <arti ...

  8. 【XR-3】核心城市(树直径)

    [XR-3]核心城市 这题真的难啊......... k个核心城市太麻烦,我们假设先找一个核心城市,应该放在哪里? \(任意取一个点,它的最远端是直径的端点.\) \(所以当这个点是直径的中点时,可以 ...

  9. 文件相关命令(find,tree,tar)文件属性信息 date

    6.13day11 文件相关命令(find,tree,tar)文件属性信息date 1 文件相关命令 1.1 find命令 查找文件用f find /root -type f -name " ...

  10. Cordova 浅析架构的原理

    因为项目使用了Cordova,也使用了很长时间.至于有很多hybride框架,为什么我们使用Cordova,这里不做过多的叙述,我们也是根据项目需求来选定的,需要及时更新.还要输出别人SDK等.没有最 ...