debounce - 防抖

133 阅读1分钟

概念描述

  • 高阶函数,传入一个函数,返回一个函数。
  • 在 delay 时间内,前后两次点击,阻止前一次点击,延迟后一次点击,重复 n 个两次,直到最后一次点击,延迟 delay 时间最后一次的点击。
  • 回调函数需要手动绑定 this 以及传参。

代码实现

/**
* @description: debounce - 防抖 
* 1、高阶函数,传入一个函数,返回一个函数。
* 2、在 delay 时间内,前后两次点击,阻止前一次点击,延迟后一次点击,重复 n 个两次,直到最后一次点击,延迟 delay 最后一次的点击。
* 3、回调函数需要手动绑定 this 以及传参。
* @author: huen2015
*/

function debounce(fn: Function, delay: number = 300): EventListenerOrEventListenerObject | any {
    let timer: any = null

    return function (this: any, ...args: any[]) {
        if (timer) {
            clearTimeout(timer)
            timer = null
        }

        timer = setTimeout(() => {
            fn.apply(this, args)
        }, delay)
    }
}

const debounceDom = document.querySelector('#debounce')
if (debounceDom) {
    // Event - UIEvent - MouseEvent - PointerEvent
    debounceDom.addEventListener('click', debounce(function (this: any, e: PointerEvent) {
        console.log('debounce - 防抖')
        console.log('this', this)
        console.log('e', e)
    }))
}

应用场景

  • click、scroll 等事件防止多次点击

  • input 输入框防止多次输入

代码演示仓库