1、事件
移动端点击会有300ms延迟问题: 可以通过
1、touchstart; 手指点击事件
2、touchmove; 手指移动事件
3、touchend; 手指离开事件
4、touchcancel; 突然手指中断触摸事件;(触摸时突然出现弹出框)
事件对象e中的触点信息:
e. touches 当前屏幕上所有触摸点的列表;;
e.changedTouches; 涉及当前(引发)事件的触摸点的列表
e.targetTouches; 当前对象上所有触摸点的列表
document.addEventListener('touchstart', function (e) {console.log(e)}, false)
2、touch点击穿透的问题:
一:touchstar点击之后;会有默认的300ms穿透事件;300ms之后button按钮被点击
button、input、a等内置的click触发机制会默认触发
二:click事件没有默认穿透但会有300ms延迟的问题
2、fastclick.js库
使用之后点击事件的300ms延迟和touchstart事件穿透可以解决
// <script src='./js/fastclick.js'>Fastclick.attach(document.body);
3、移动端点击事件的封装
// exam:let el = new TouchPack(el)// el: 给哪一个元素添加touch// el.tap(callback) el.longtap(callback)(() => {function TouchPack(opt) {this.el = document.querySelector(opt.el);}TouchPack.prototype = {tap(callback) {let sTime, eTime;let fn = function (e) {e.preventDefault(); // 去除触摸穿透和点击的默认事件switch (e.type) {case 'touchstart':sTime = new Date().getTime();break;case 'touchend':eTime = new Date().getTime();if (eTime - sTime <= 500) {callback.call(this);}break;}};this.el.addEventListener('touchstart', fn, false);this.el.addEventListener('touchend', fn, false);},longtap(callback, delay) {var delay = delay || 1000,t = null;let fn = function (e) {switch (e.type) {case 'touchstart':t = setTimeout(() => {callback.call(this);}, delay);break;case 'touchmove':clearTimeout(t);t = null;break;case 'touchend':clearTimeout(t);t = null;break;}};this.el.addEventListener('touchstart', fn, false);this.el.addEventListener('touchmove', fn, false);this.el.addEventListener('touchend', fn, false);},};window.TouchPack = TouchPack;})();
