fastClick入坑爬坑详解
来源:互联网 发布:微信小视频修改软件 编辑:程序博客网 时间:2024/06/07 07:23
fastClick入坑爬坑详解
公司之前要上线一个移动支付项目,主要页面如下:
问题来了,移动端click事件一般至少有300ms的延迟,如果输入频率不高,完全可以忽视这个问题;
但是,变态的测试要求跟原生效果一样(当时我心里是懵逼的,因为完全没搞过啊).
老板逼得紧,强行上呗(公司就我一个前端).
搞完后的情况是:
借用领导一句话,安卓如丝般顺滑,iPhone卡成翔.当时测试那边简直是想要搞事啊,分分钟就要来个自爆.
好吧,想办法解决呗.就找到了fastclick.js.具体使用如下:
function NoClickDelay(el) { this.element = typeof el == 'object' ? el: document.getElementById(el); if (window.Touch) this.element.addEventListener('touchstart', this, false);}NoClickDelay.prototype = { handleEvent: function(e) { switch (e.type) { case 'touchstart': this.onTouchStart(e); break; case 'touchmove': this.onTouchMove(e); break; case 'touchend': this.onTouchEnd(e); break; } }, onTouchStart: function(e) { e.preventDefault(); this.moved = false; this.theTarget = document.elementFromPoint(e.targetTouches[0].clientX, e.targetTouches[0].clientY); if (this.theTarget.nodeType == 3) this.theTarget = theTarget.parentNode; this.theTarget.className += ' pressed'; this.element.addEventListener('touchmove', this, false); this.element.addEventListener('touchend', this, false); }, onTouchMove: function(e) { this.moved = true; this.theTarget.className = this.theTarget.className.replace(/ ?pressed/gi, ''); }, onTouchEnd: function(e) { this.element.removeEventListener('touchmove', this, false); this.element.removeEventListener('touchend', this, false); if (!this.moved && this.theTarget) { this.theTarget.className = this.theTarget.className.replace(/ ?pressed/gi, ''); var theEvent = document.createEvent('MouseEvents'); theEvent.initEvent('click', true, true); this.theTarget.dispatchEvent(theEvent); } this.theTarget = undefined; }};
再调用NoClickDelay这个方法
window.addEventListener('load', function() { FastClick.attach(document.body); }); new NoClickDelay(document.getElementById('el'));
FastClick.attach(document.body); 这里面的document.body是要做无延迟点击的区域 NoClickDelay里面的元素ID就是该区域ID.然后在这个区域内正常写点击事件,如下:
ele.addEventListener('click',handler, true);
看官请注意:金额数字非法或为0肯定要有提示是吧,坑就出在这儿了.不知道各位看官对JS自带的alert函数了解多少. 最近书看多了才知道,alert会中止当前JS进程,注意是'中止'而不是'终止'.如果没有其他事件触发, 页面会停止在当前状态,保持不变.而fastclick是要求我们一套大保健全部走完,才会给出我们想要的结果 异常中止的后果就是: 在我们看来,alert就表示当前操作已经完成, 但是fastclick认为你流程没有走完,反馈给我们的实际结果就是类似于'继承(当前按钮继承上一个被中止按钮)'. 实际上fastclick是认为alert完事后的下一次点击操作用来弥补被中止流程的下半段. 再下一次才是正常点击事件. 至于我为什么要用alert,因为简单粗暴,完全没考虑过后果. 当时不知道为什么会出现这个问题,也就无法解决. 最终上线版本,还是用的触摸事件:touchStart和touchEnd.同样,给出一个区域,在上面绑定touchStart事件,给单个按钮绑定touchEnd.不过仍然存在可容忍范围内的延迟.
0 0
- fastClick入坑爬坑详解
- fastclick
- 外部-fastclick
- FastClick插件
- fastclick.js
- JavaScript事件详解-zepto的事件实现(二)【新增fastclick阅读笔记】
- fastclick使用与解密
- fastclick的使用
- js原生实现FastClick事件
- 点击穿透与FastClick浅读
- H5开发:fastclick取代tap
- fastclick.js插件使用简单说明
- 深入解析FastClick解决延迟点击
- FastClick使用之trigger触发click失效
- FastClick使用之trigger触发click失效
- fastclick.js插件使用简单说明
- [源码解读] FastClick.js源码解读
- fastclick.js插件使用简单说明
- 服务不支持chkconfig解决方法脚本
- Window VMware MAC OS 安装
- 如何通过安装包安装应用到手机
- (4.6.22.2)来吧,是时候撸一份自己的RxJava框架啦:代理模式实现线程调度
- 网页刷新或者重新加载后滚动条的位置不变
- fastClick入坑爬坑详解
- 货币金额转化大写
- 通信死时间以及缓冲队列的使用对系统死时间的影响
- 第十八节,修饰器
- rpm 解压和查看清单
- .net core中有哪些被抛弃的类
- 在oracle里如何将String转换成Date?????
- MFC DLL
- BootStrap--CSS组件--按钮组(btn-group)