1、事件

移动端点击会有300ms延迟问题: 可以通过
1、touchstart; 手指点击事件
2、touchmove; 手指移动事件
3、touchend; 手指离开事件
4、touchcancel; 突然手指中断触摸事件;(触摸时突然出现弹出框)

事件对象e中的触点信息:

e. touches 当前屏幕上所有触摸点的列表;
e.changedTouches; 涉及当前(引发)事件的触摸点的列表
e.targetTouches; 当前对象上所有触摸点的列表

  1. document.addEventListener('touchstart', function (e) {
  2. console.log(e)
  3. }, false)

2、touch点击穿透的问题:

一:touchstar点击之后;会有默认的300ms穿透事件;300ms之后button按钮被点击
button、input、a等内置的click触发机制会默认触发
二:click事件没有默认穿透但会有300ms延迟的问题
image.png
2、fastclick.js库
使用之后点击事件的300ms延迟和touchstart事件穿透可以解决

  1. // <script src='./js/fastclick.js'>
  2. Fastclick.attach(document.body);

3、移动端点击事件的封装

  1. // exam:let el = new TouchPack(el)
  2. // el: 给哪一个元素添加touch
  3. // el.tap(callback) el.longtap(callback)
  4. (() => {
  5. function TouchPack(opt) {
  6. this.el = document.querySelector(opt.el);
  7. }
  8. TouchPack.prototype = {
  9. tap(callback) {
  10. let sTime, eTime;
  11. let fn = function (e) {
  12. e.preventDefault(); // 去除触摸穿透和点击的默认事件
  13. switch (e.type) {
  14. case 'touchstart':
  15. sTime = new Date().getTime();
  16. break;
  17. case 'touchend':
  18. eTime = new Date().getTime();
  19. if (eTime - sTime <= 500) {
  20. callback.call(this);
  21. }
  22. break;
  23. }
  24. };
  25. this.el.addEventListener('touchstart', fn, false);
  26. this.el.addEventListener('touchend', fn, false);
  27. },
  28. longtap(callback, delay) {
  29. var delay = delay || 1000,
  30. t = null;
  31. let fn = function (e) {
  32. switch (e.type) {
  33. case 'touchstart':
  34. t = setTimeout(() => {
  35. callback.call(this);
  36. }, delay);
  37. break;
  38. case 'touchmove':
  39. clearTimeout(t);
  40. t = null;
  41. break;
  42. case 'touchend':
  43. clearTimeout(t);
  44. t = null;
  45. break;
  46. }
  47. };
  48. this.el.addEventListener('touchstart', fn, false);
  49. this.el.addEventListener('touchmove', fn, false);
  50. this.el.addEventListener('touchend', fn, false);
  51. },
  52. };
  53. window.TouchPack = TouchPack;
  54. })();