前端防抖节流


/**
 * 防抖核心代码
 * 逻辑是
 * 第一次点完以后开始计时
 * 如果单位时间内点了的话
 * 不但无效,而且时间从头计算
 *
 * 例如
 * 设置3000毫秒
 * 第一次点完如果3秒内再次点击
 * 不但不触发任何效果,而且3秒从头开始算
 * 如果一直点一直点,就永远无效
 */
function debounce(fn, timer) {
    let timeout = null;
    return function () {
        if (timeout) {
            clearTimeout(timeout);
        } else {
            fn.apply(this, arguments);
        }
        timeout = setTimeout(() => {
            timeout = null;
        }, timer);
    }
}


/**
 * 节流核心代码
 * 逻辑是
 * 第一次点完以后开始计时
 * 如果下次点击时间没达到设定时间
 * 则无效,否则有效
 *
 * 例如
 * 设置3000毫秒
 * 第一次点击完过了1秒点击 判定为无效 立刻记录当前时间
 * 过了2秒点击 与上一次时间对比 不足3秒 判定无效
 * 过了3秒以上点击 与上次时间对比 足够3秒 判定有效 并立刻记录当前时间
 *
 */
function throttle(fn, delay) {
    let begin = 0;
    return function () {
        const current = new Date().getTime();
        if (current - begin > delay) {
            fn.apply(this, arguments);
            begin = current;
        }
    }
}

/** 简单例子 */
bt0.addEventListener('click', click0, false);
bt1.addEventListener('click', debounce(click1, 1000), false);
bt2.addEventListener('click', throttle(click2, 1000), false);
posted @ 2022-11-17 11:55  冬天不眠  阅读(22)  评论(0编辑  收藏  举报