fastclick.js解决移动端(ipad)点击事件反应慢问题

参考http://blog.csdn.net/xjun0812/article/details/64919063

    http://www.jianshu.com/p/16d3e4f9b2a9

问题的发现

上班做项目的时候碰到一个移动端项目,其中有个小游戏,相当于天上掉馅饼,用户需要点击馅饼获得。游戏做好之后在pc端测试是没问题的,安卓手机上测试也是没问题的,但是部分苹果手机就出现了问题,用户点击馅饼没有反应。

后来调试的时候,我让这些馅饼静止在屏幕上,这些苹果手机用户就可以点击了。才发现是因为点击事件延迟的原因导致移动的对象不能被用户点击,经过一定时间的延迟,该对象已经移到到其他地方去了。

移动端页面对于点击事件会有300毫秒的延迟,也就是js捕获click事件的回调函数处理,需要300ms后才生效,导致多数用户感觉移动设备上基于HTML的web应用界面响应速度慢,甚至有时候会影响一些业务逻辑的处理。

为什么会存在延迟?

Google开发者文档中有提到:

mobile browsers will wait approximately 300ms from the time that you tap the button to fire the click event. The reason for this is that the browser is waiting to see if you are actually performing a double tap.

移动浏览器为什么会设置300毫秒的等待时间呢?这与双击缩放的方案有关。平时我们有可能已经注意到了,双击缩放,即用手指在屏幕上快速点击两次,可以看到内容或者图片放大,再次双击,浏览器会将网页缩放至原始比例。

浏览器捕获第一次单击后,会先等待一段时间,如果在这段时间区间里用户未进行下一次点击,则浏览器会做单击事件的处理。如果这段时间里用户进行了第二次单击操作,则浏览器会做双击事件处理。这段时间就是上面提到的300毫秒延迟。

如何避免延迟

在特定场景如一些游戏页面,我们需要取消300毫毛的延迟。目前有以下方法:

方法一:静止缩放

[html] view plain copy

  1. <meta name="viewport" content="width=device-width user-scalable= ‘no‘">

使用这个方法必须完全禁用缩放来达到目的,虽然大部分移动端能解决这个延迟问题,但是部分苹果手机还是不行。

方法二:fastclick.js

FastClick 是 FT Labs 专门为解决移动端浏览器 300 毫秒点击延迟问题所开发的一个轻量级的库。简而言之,FastClick 在检测到touchend事件的时候,会通过 DOM 自定义事件立即触发一个模拟click事件,并把浏览器在 300 毫秒之后真正触发的click事件阻止掉。使用方法如下。

第一步:在页面中引入fastclick.js文件。

第二步:在js文件中添加以下代码
      在 window load 事件之后,在body上调用FastClick.attach()即可。

[javascript] view plain copy

  1. window.addEventListener(function(){
  2. FastClick.attach( document.body );
  3. },false );

如果你项目使用了JQuery,就将上面的代码改写成:

[javascript] view plain copy

  1. $(function() {
  2. FastClick.attach(document.body);
  3. });

方法三:指针事件

指针事件最初由微软提出,现已进入 W3C 规范的候选推荐标准阶段 (Candidate Recommendation)。指针事件是一个新的 web 事件系列,相应的规范旨在使用一个单独的事件模型,对所有输入类型,包括鼠标 (mouse)、触摸 (touch)、触控 (stylus) 等,进行统一的处理。

指针事件 (Pointer Events) 目前兼容性不太好,不知道在以后会不会更加支持。

注意事项

要注意使用场景。

文中表述仅代表个人观点,如果有更好的方法,欢迎分享。

时间: 2024-08-04 03:43:38

fastclick.js解决移动端(ipad)点击事件反应慢问题的相关文章

JS 插件 fastclick.js 解决手机端click点击延迟

fastclick.js 什么用 加快手机的反映速度,测试是可以用的,很快... fastclick的js FastClick 是一个简单,易于使用的JS库用于消除在移动浏览器上触发click事件与一个物理Tap(敲击)之间的300延迟.它支持以下浏览器:Mobile Safari on iOS 3 and upwardsChrome on iOS 5 and upwardsChrome on Android (ICS)Opera Mobile 11.5 and upwardsAndroid B

fastclick.js --- 解决移动端点击事件300ms延时

Fast Click 是一个简单.易用的库,专为消除移动端浏览器从物理触摸到触发点击事件之间的300ms延时. 为什么会存在延迟呢? 从你触摸按钮到触发点击事件,移动端浏览器会等待接近300ms,原因是浏览器会等待以确定你是否执行双击事件 兼容性 Mobile Safari on iOS 3 and upwards Chrome on iOS 5 and upwards Chrome on Android (ICS) Opera Mobile 11.5 and upwards Android B

ios移动端浏览器点击事件失效的解决方案

点击事件失效的原因可能是因为,你用了事件代理了, 比如这样 $(document).on("click",".fd",function(){ }) 这段代码在安卓机上是没有问题的,但是iso的自带浏览器和微信浏览器和其他浏览器都会失效,原因是ios规定,事件代理的元素只能是button元素其他一律不生效 想要解决这个问题,也很简单 1. $(document).on("click","button",function(){ }

Android学习之解决ListView中item点击事件和item中Button点击事件冲突问题

在ListView中添加Button后,如果只是单纯的加入而不加限制的话,ListView的onClick点击事件没有响应,因为Button获取了item的焦点,想要两者都可点击,需要加上如下限制: 在ListView的适配器中的布局文件中添加: (1)在布局文件的根元素上中添加属性android:descendantFocusability="blocksDescendants" (2)在Button中添加属性android:focusable="false"和a

JS解决重复绑定问题以及获取事件

1.一些数据交互元素如button 为了避免重复提交信息,可以在$.post或$.get后unbind,在收到返回后再重新绑定:或者将button设置为disabled 2.在ajax可能改变某些参数,同事参数需要在bind时赋值的,在参数变动后需要unbind再重新bind 3.某个元素的click行为是动态绑定的,将会有可能出现重复的绑定,点击一次元素将会触发两次绑定:因此动态绑定的方法需要在绑定时提前解除绑定: 4.使用jQuery的off('click')或者unbind('click'

为啥使用Iscroll.js之后,a不能触发点击事件?

原因:是iscroll.js阻止了a的行为. 解决方法:打开iscroll-probe.js,然后找到preventDefaultException方法. 然后修改为: // preventDefault: true,preventDefault: false,//(把这句加上去哦)preventDefaultException: { tagName: /^(INPUT|TEXTAREA|BUTTON|SELECT|A)$/ },  //(这个后面加|A,因为iscroll阻止了A的默认事件)

解决echarts中的点击事件点击后走多次接口

使用echarts图点击图之后,走了很多次接口,后来发现添加一个off事件就可以解决了,具体如下: 原文地址:https://www.cnblogs.com/whdaichengxu/p/11978299.html

js判断移动端手势 上下左右滑动事件

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="https://apps.bdimg.com/libs/jquery/1.10.2/jquery.min.js"></script> </head> <body style="hei

通过JS控制各种元素的点击事件的事件间隔

<script type="text/javascript"> document.write(sumdemo(1, 2)); var btn = document.getElementById('btn'); btn.onclick = function() { this.disabled = 'disabled'; setTimeout(function() { btn.disabled = ''; }, 1000);//1秒后才能点击 }; </script>