为什么要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)