家政小程序
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /*
  2. eventDelayLock使用方法:
  3. 事件防快速点击处理已放到common.js/controller中, 可以通过$.controller.eventDelayLock访问.
  4. 事件锁为全局模式, 一旦触发锁状态, 在解开前任何用户操作事件都会被阻止.
  5. 解锁提供两种模式:
  6. 1. 延时自动解锁: 延时一段时间后自动解锁, 默认1000ms, 可自定义. 在锁状态新事件的触发会重新设置定时器.
  7. 使用方法: 在事件回调的头部加入以下方法调用即可, 如果在锁状态会直接退出停止执行回调.
  8. // 第一个参数指定是否起用自动模式, true自动模式, false手动模式
  9. // 自动模式下第二个参数用来指定延时时间(ms), 缺省1000ms
  10. if ($.controller.eventDelayLock.lock(true, 1000)) {
  11. return;
  12. }
  13. // 或这样写更简洁
  14. ($.controller.eventDelayLock.lock(true, 1000)) && return;
  15. 2. 手动解锁: 锁设置后不会自动解锁
  16. // 设置锁
  17. if ($.controller.eventDelayLock.lock(false)) {
  18. return;
  19. }
  20. // 清空锁状态, 同时清空定时器
  21. $.controller.eventDelayLock.unLock();
  22. */
  23. // 取设备系统: IOS, ANDROID
  24. let _getPlatform = function () {
  25. let _platform = '';
  26. let _sysInfo = wx.getSystemInfoSync();
  27. if (_sysInfo && _sysInfo.system) {
  28. let _system = _sysInfo.system.toUpperCase();
  29. if (_system.indexOf('IOS') >= 0) {
  30. _platform = 'IOS';
  31. } else if (_system.indexOf('ANDROID') >= 0) {
  32. _platform = 'ANDROID';
  33. }
  34. }
  35. return _platform;
  36. };
  37. // 防止按钮快速重复点击
  38. // 在按钮点下时设置一个全局延时锁, 在锁关闭前不响应用户操作, 在1000ms的时间后锁会自动复位。
  39. let eventDelayLock = (function () {
  40. // 延时时间, ms
  41. let _defaultDelayTime = 1000;
  42. // 锁状态
  43. let _eventDelayLock = false;
  44. // 是否自动解锁
  45. let _autoUnlock = true;
  46. // 定时器
  47. let _lockTimer = 0;
  48. // 上锁的时间
  49. let _lockTime = 0;
  50. // 解锁时间
  51. let _unLockTime = 0;
  52. let _delayTime = 0;
  53. // 定时器类
  54. let _lock = {};
  55. // 不同平台特殊处理
  56. let _platform = _getPlatform();
  57. if (_platform == 'IOS') {
  58. _defaultDelayTime = 500;
  59. }
  60. // 是否锁状态: true是, false不是
  61. // _ifAutoUnlock: 是否自动解锁, 必须提供, 不自动解锁默认时间是10秒
  62. // _delay: 解锁延时ms, 缺省_defaultDelayTime
  63. _lock.lock = function (_ifAutoUnlock, _delay) {
  64. let _t = Date.now();
  65. let _curLockState = _eventDelayLock;
  66. // 时间超过预定解锁时间, 不论是否自动解锁都返回解锁状态
  67. // 如果事件触发的间隔非常短, 这种情况不可能是人为的, 可能是因为事件多层绑定重复触发的, 这种情况就不用上锁
  68. // 人手点击的最高记录是17, 50ms可以保证不可能是人触发的
  69. let _validT = 50;
  70. if (_t >= _unLockTime || _t < _lockTime + _validT) {
  71. _curLockState = false;
  72. _eventDelayLock = false;
  73. }
  74. // 不在锁状态, 新的设置请求才会起作用
  75. if (!_curLockState) {
  76. _eventDelayLock = true;
  77. _autoUnlock = _ifAutoUnlock;
  78. _lockTime = _t;
  79. // 不自动解锁的默认时间是10秒
  80. !_autoUnlock && (_delay = 10000);
  81. _delayTime = _delay || _defaultDelayTime;
  82. _unLockTime = _lockTime + _delayTime;
  83. }
  84. return _curLockState;
  85. };
  86. // 清空锁状态, 同时清空定时器
  87. // _force: 立即解锁
  88. _lock.unLock = function (_force) {
  89. if (_force) {
  90. _eventDelayLock = false;
  91. _lockTime = 0;
  92. _unLockTime = 0;
  93. } else {
  94. // 锁之后解锁的最短时间
  95. var _minTime = _delayTime;
  96. if (_minTime > 300) {
  97. _minTime = 300;
  98. }
  99. // 避免太快解锁
  100. let _dt = Date.now() - _lockTime;
  101. if (_dt >= _minTime) {
  102. _eventDelayLock = false;
  103. _lockTime = 0;
  104. _unLockTime = 0;
  105. } else {
  106. setTimeout(function () {
  107. _eventDelayLock = false;
  108. _lockTime = 0;
  109. _unLockTime = 0;
  110. }, _minTime - _dt);
  111. }
  112. }
  113. };
  114. _lock.getState = function () {
  115. return _eventDelayLock;
  116. };
  117. return _lock;
  118. })();
  119. export default eventDelayLock;