/* eventDelayLock使用方法: 事件防快速点击处理已放到common.js/controller中, 可以通过$.controller.eventDelayLock访问. 事件锁为全局模式, 一旦触发锁状态, 在解开前任何用户操作事件都会被阻止. 解锁提供两种模式: 1. 延时自动解锁: 延时一段时间后自动解锁, 默认1000ms, 可自定义. 在锁状态新事件的触发会重新设置定时器. 使用方法: 在事件回调的头部加入以下方法调用即可, 如果在锁状态会直接退出停止执行回调. // 第一个参数指定是否起用自动模式, true自动模式, false手动模式 // 自动模式下第二个参数用来指定延时时间(ms), 缺省1000ms if ($.controller.eventDelayLock.lock(true, 1000)) { return; } // 或这样写更简洁 ($.controller.eventDelayLock.lock(true, 1000)) && return; 2. 手动解锁: 锁设置后不会自动解锁 // 设置锁 if ($.controller.eventDelayLock.lock(false)) { return; } // 清空锁状态, 同时清空定时器 $.controller.eventDelayLock.unLock(); */ // 取设备系统: IOS, ANDROID let _getPlatform = function () { let _platform = ''; let _sysInfo = wx.getSystemInfoSync(); if (_sysInfo && _sysInfo.system) { let _system = _sysInfo.system.toUpperCase(); if (_system.indexOf('IOS') >= 0) { _platform = 'IOS'; } else if (_system.indexOf('ANDROID') >= 0) { _platform = 'ANDROID'; } } return _platform; }; // 防止按钮快速重复点击 // 在按钮点下时设置一个全局延时锁, 在锁关闭前不响应用户操作, 在1000ms的时间后锁会自动复位。 let eventDelayLock = (function () { // 延时时间, ms let _defaultDelayTime = 1000; // 锁状态 let _eventDelayLock = false; // 是否自动解锁 let _autoUnlock = true; // 定时器 let _lockTimer = 0; // 上锁的时间 let _lockTime = 0; // 解锁时间 let _unLockTime = 0; let _delayTime = 0; // 定时器类 let _lock = {}; // 不同平台特殊处理 let _platform = _getPlatform(); if (_platform == 'IOS') { _defaultDelayTime = 500; } // 是否锁状态: true是, false不是 // _ifAutoUnlock: 是否自动解锁, 必须提供, 不自动解锁默认时间是10秒 // _delay: 解锁延时ms, 缺省_defaultDelayTime _lock.lock = function (_ifAutoUnlock, _delay) { let _t = Date.now(); let _curLockState = _eventDelayLock; // 时间超过预定解锁时间, 不论是否自动解锁都返回解锁状态 // 如果事件触发的间隔非常短, 这种情况不可能是人为的, 可能是因为事件多层绑定重复触发的, 这种情况就不用上锁 // 人手点击的最高记录是17, 50ms可以保证不可能是人触发的 let _validT = 50; if (_t >= _unLockTime || _t < _lockTime + _validT) { _curLockState = false; _eventDelayLock = false; } // 不在锁状态, 新的设置请求才会起作用 if (!_curLockState) { _eventDelayLock = true; _autoUnlock = _ifAutoUnlock; _lockTime = _t; // 不自动解锁的默认时间是10秒 !_autoUnlock && (_delay = 10000); _delayTime = _delay || _defaultDelayTime; _unLockTime = _lockTime + _delayTime; } return _curLockState; }; // 清空锁状态, 同时清空定时器 // _force: 立即解锁 _lock.unLock = function (_force) { if (_force) { _eventDelayLock = false; _lockTime = 0; _unLockTime = 0; } else { // 锁之后解锁的最短时间 var _minTime = _delayTime; if (_minTime > 300) { _minTime = 300; } // 避免太快解锁 let _dt = Date.now() - _lockTime; if (_dt >= _minTime) { _eventDelayLock = false; _lockTime = 0; _unLockTime = 0; } else { setTimeout(function () { _eventDelayLock = false; _lockTime = 0; _unLockTime = 0; }, _minTime - _dt); } } }; _lock.getState = function () { return _eventDelayLock; }; return _lock; })(); export default eventDelayLock;