为什么要js做防抖处理:当表单提交时,如果用户点击了好多次,后台很容易提交多次数据;搜索不做防抖,将请求多次数据;监听输入框输入时,如果监听值变化就请求数据的话,也会一直请求数据,对服务器造成不好的影响,这时就要用到防抖,在一定时间内禁止再次触发事件!
1.定义
函数防抖(debounce):触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间
2.实现原理
- 实现方式:每次触发事件时设置一个延迟调用方法,并且取消之前的延时调用方法
- 缺点:如果事件在规定的时间间隔内被不断的触发,则调用方法会被不断的延迟
3.代码案例
function debounce(func, ms = 1000) {
let timer; // 创建一个标记用来存放定时器的返回值
return function (...args) {
// 每当触发防抖事件时把前一个 setTimeout clear 掉
if (timer) {
clearTimeout(timer)
}
// 然后又创建一个新的 setTimeout, 这样就能保证interval 间隔内如果时间持续触发,就不会执行 fn 函数
timer = setTimeout(() => {
func.apply(this, args)
}, ms)
}
}
// 处理函数
const task = () => { console.log('run task') };
const debounceTask = debounce(task, 1000);
// 绑定触发防抖事件
window.addEventListener('scroll', debounceTask)