# 防抖函数概念

计n秒, 时间到了才执行

  • 事件触发, n秒后开始执行代码, 如果n秒内, 事件再次出发, 则n秒重新计时
  • 案例: 鼠标频繁触发移入事件
  • 问题: 事件多次触发, 导致异步Ajax多次触发, 多次铺设页面
  • 解决: 事件触发, 1秒后再执行, 如果1秒内, 再次触发, 则重新计时1秒.

# 代码

DOM标签里, 绑定方式:

`<button onmouseover="debounce(btn, 1, ${obj.id})">${obj.catalog}</button>`
function debounce(fn, time, ...arg) {
    if (fn.t !== undefined) clearTimeout(fn.t); // 如果定时器存在, 先清除
    fn.t = setTimeout(() => { // 重新开始定时
        fn(...arg); // 把多个参数, 拆开传下去, fn相当于btn方法名
    }, time * 1000);
}
1
2
3
4
5
6
7

JS里绑定, 最终版

$("#buttonDiv>button").on("mouseover", debounce(btn, 1, 242));
function debounce(fn, time, ...arg) {
    return function(){
        if (fn.t !== undefined) clearTimeout(fn.t); // 如果定时器存在, 先清除
        fn.t = setTimeout(() => { // 重新开始定时
            fn(...arg); // 把多个参数, 拆开传下去
        }, time * 1000);
    }
}
1
2
3
4
5
6
7
8
9

# 立即执行版

function debounce(fn, time, ...arg) {
    if (fn.t === undefined) fn(...arg); // 立即执行版
    if (fn.t !== undefined) clearTimeout(fn.t); 
    fn.t = setTimeout(() => { 
        fn(...arg); 
    }, time * 1000);
}
1
2
3
4
5
6
7

# 使用场景

  • 移入/移出 等 事件, 防止多次触发
  • onresize / scroll 事件, 防止多次触发
  • 文本输入(动态进行Ajax请求), 防止多次触发
上次更新时间: 1/5/2021, 11:15:18 AM