You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

58 lines
1.8 KiB

/**
* 函数防抖模块封装
* @author lautin
* @created 2019-11-20 18:44:32
*/
/**
* 防抖函数,在一个时段内反复触发时 更新定时器为最后一次延迟执行
* 该操作欠缺的地方在于 延迟执行,响应比较慢 最好是先执行
* @param {function} func 事件回调函数
* @param {number} wait 延迟等待时间,建议100-300ms左右
*/
function debounceA(func, wait) {
// 初始化定时器为空
let timer = null;
// 返回一个防抖的闭包函数,使用闭包来持久存储定时器
return function () {
const context = this, // this为事件源DOM
args = arguments; // arguments包含event
// 如果已有定时器 则取消上次的任务
if (timer) clearTimeout(timer);
// 更新定时器,本次(最后)任务n毫秒后触发
timer = setTimeout(() => {
// 还原事件回调函数触发时的环境
func.apply(context, args);
}, wait);
}
}
/**
* 防抖函数,在一个时段内反复触发时 更新定时器为最后一次延迟执行
* 该方法 先执行 后延迟 响应灵敏更高
* @param {function} func 事件回调函数
* @param {number} wait 延迟等待时间,建议100-300ms左右
*/
function debounceB(func, wait) {
let timer = null;
return function () {
const context = this,
args = arguments;
// 首先取消中间的定时器,重新开始计时
if (timer) clearTimeout(timer);
//先加载本次任务,
if (!timer) func.apply(context, args);
// 再进行定时器控制
timer = setTimeout(() => {
timer = null;
}, wait);
}
}
export default function debounce(func, wait, immediate = false) {
return immediate ? debounceB(func, wait) : debounceA(func, wait);
}