123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- /*
- 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;
|