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. IO与反射机制总结

    IO与反射机制全面总结 一.file类:属于java.io包中kkb 作用:操作文件或目录 file既可以表示文件,也可以表示目录,也可以表示盘符.利用他可以用来对文件进行操作. file中常用的构造 ...

  2. Docker 快速安装Jenkins完美教程 (亲测采坑后详细步骤)

    一.前言 有人问,为什么要用Jenkins,在一些中小型企业?我说下我以前开发的痛点,每次开发一个项目完成后,需要打包部署,可能没有专门的运维人员,只能开发人员去把项目打成一个war包,可能这个项目已 ...

  3. shell字符串索引

    shell中的字符串索引一会从0开始,一会从1开始,见例子: #!/bin/bash string="hello world" length=${#string} echo &qu ...

  4. 关于MySQL数据库的卸载

    首先对于MySQL这款数据库来讲,不能简单的卸载就草草了事,我们首先在mysql的文件下面找到my.ini这个文件, 在其中找到mysql数据库所产生的data文件,这个文件一般在c盘的一个隐藏目录下 ...

  5. pycharm添加头注释

    1.进入setting->Editor->File and Code Templates->Python Script 2.添加内容 # coding = 'utf-8'# @作者: ...

  6. 安卓集成Unity开发示例(一)

    本项目目的是在移动端的 Native App 中以库的形式集成已经写好的 Unity 工程,利用 Unity 游戏引擎便捷的开发手段进行跨平台开发. Unity官方文档 Unity as a Libr ...

  7. Ubuntu系统make menuconfig的依赖包ncurses安装

    Linux内核或者u-boot进行make menuconfig的时候,如果系统上没有安装ncurses,就会出现以下报错 *** Unable to find the ncurses librari ...

  8. Java多线程带返回值的Callable接口

    Java多线程带返回值的Callable接口 在面试的时候,有时候是不是会遇到面试会问你,Java中实现多线程的方式有几种?你知道吗?你知道Java中有可以返回值的线程吗?在具体的用法你知道吗?如果两 ...

  9. java ->包的声明与访问

    包的声明与访问 包的概念 java的包,其实就是我们电脑系统中的文件夹,包里存放的是类文件. 当类文件很多的时候,通常我们会采用多个包进行存放管理他们,这种方式称为分包管理. 在项目中,我们将相同功能 ...

  10. 当Tomcat遇上Netty

    故事背景 嘀嘀嘀~,生产事故,内存泄漏! 昨天下午,突然收到运维的消息,分部某系统生产环境内存泄漏了,帮忙排查一下. 排查过程 第一步,要日志 分部给到的异常日志大概是这样(鉴于公司规定禁止截图禁止拍 ...