js 防抖处理?

作者站长头像
站长
· 阅读数 6

js 防抖处理?

右下角有一个按钮来控制滑块位置, 具体代码如下

<style>
    #rollBtn .sc-box {
        bottom: 3rem;
        right: 3rem;
        background-color: rgba(var(--sc-primary-rgb), .5);
    }

    #rollBtn .sc-status-bottom {
        transform: rotate(180deg);
    }
</style>

<aside id="rollBtn">
    <div class="sc-box position-fixed d-inline-block rounded-circle cursor-pointer p-3 transition-500 waves-effect waves-dark">
        <img src="http://localhost:8002/assets/images/chevron-down.svg">
    </div>
</aside>

<script>
    function debounce(func, wait) {
        let timeout;
        return () => {
            clearTimeout(timeout);
            timeout = setTimeout(func, wait);
        }
    }

    $('#rollBtn .sc-box').click(() => {
        $("html").animate({
            scrollTop: 1000
        }, 1000);
    });
</script>

但是当用户连续点击的时候页面就会卡死, 这个情况可以怎么进行防抖优化?debounce 是原先封装的方法, 但这个方法并不适用这个需求debounce 是延迟执行, 也就是如果调这个方法传1秒, 那我点击这个按钮后1秒才开始执行里面的方法想稍微改一下, 变成先执行, 后延迟1秒 (先执行$("html").animate, 并且在执行1期间将$("html").animate 锁定1秒的时间)

回复
1个回答
avatar
test
2024-07-01

送你一个可以立即执行的debounce函数

/**
 * @desc 函数防抖
 * @param func 目标函数
 * @param wait 延迟执行毫秒数
 * @param immediate true - 立即执行, false - 延迟执行
 */
function debounce (func, wait = 1000, immediate = true) {
    let timer;
    return function() {
        let context = this,
            args = arguments;
        if (timer) clearTimeout(timer);
        if (immediate) {
            let callNow = !timer;
            timer = setTimeout(() => {
                timer = null;
            }, wait);
            if (callNow) func.apply(context, args);
        } else {
            timer = setTimeout(() => {
                func.apply(context, args);
            }, wait)
        }
    }
}
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容