当前位置: 首页 > 知识库问答 >
问题:

javascript - js 防抖处理?

钮才哲
2023-06-21

image.png

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

<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秒的时间)

共有5个答案

汤兴生
2023-06-21
function throttle(func, wait) {
    var context, args;
    var previous = 0;

    return function () {
        var now = +new Date();
        context = this;
        args = arguments;
        if (now - previous > wait) {
            func.apply(context, args);
            previous = now;
        }
    };
}
$("#rollBtn .sc-box").click(
    throttle(() => {
        $("html").animate(
            {
                scrollTop: 1000,
            },
            1000
        );
    }, 1000)
);
曾修真
2023-06-21

防抖函数

const debounce = (fn, delay = 50) => {
    var timer
    return function () {
        var th = this
        var args = arguments
        if (timer) {
            clearTimeout(timer)
        }
        timer = setTimeout(function () {
            timer = null
            fn.apply(th, args)
        }, delay)
    }
}
张浩阔
2023-06-21

这种问题可以使用节流,让用户点击后立马执行,设置节流时间为1s,用户在1s内的无论点击多少次只执行第一次就可以了。

李昱
2023-06-21

jQuery的话,先使用 .stop() 结束动画,然后在执行动画就好了。

  • $("html").stop().animate({scrollTop: 1000}, 1000)

后来好像jQuery有改进过这个动画函数,但是我不记得了怎么改造了。只记得原来先 stop 然后再 animate 执行新动画这种步骤了。

尉迟龙光
2023-06-21

送你一个可以立即执行的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)
        }
    }
}
 类似资料:
  • 本文向大家介绍js的节流和防抖?相关面试题,主要包含被问及js的节流和防抖?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: http://www.cnblogs.com/coco1s/p/5499469.html 参考回答: 必要性:由于字符串、对象和数组没有固定大小,所有当他们的大小已知时,才能对他们进行动态的存储分配。JavaScript程序每次创建字符串、数组或对象时,解释器都必须分

  • 本文向大家介绍浅谈JS函数节流防抖,包括了浅谈JS函数节流防抖的使用技巧和注意事项,需要的朋友参考一下 在前端开发中有一部分的用户行为会频繁的触发事件执行,而对于DOM操作、资源加载等耗费性能的处理,很可能导致界面卡顿,甚至浏览器的崩溃。函数节流(throttle)和函数防抖(debounce)就是为了解决类似需求应运而生的。 函数节流(throttle) 函数节流就是预定一个函数只有在大于等于执

  • 本文向大家介绍javascript防抖函数debounce详解,包括了javascript防抖函数debounce详解的使用技巧和注意事项,需要的朋友参考一下 定义及解读 防抖函数 debounce 指的是某个函数在某段时间内,无论触发了多少次回调,都只执行最后一次。假如我们设置了一个等待时间 3 秒的函数,在这 3 秒内如果遇到函数调用请求就重新计时 3 秒,直至新的 3 秒内没有函数调用请求,

  • 本文向大家介绍深入了解JavaScript 防抖和节流,包括了深入了解JavaScript 防抖和节流的使用技巧和注意事项,需要的朋友参考一下 概述 说明 在项目过程中,经常会遇到一个按钮被多次点击并且多次调用对应处理函数的问题,而往往我们只需去调用一次处理函数即可。有时也会遇到需要在某一规则内有规律的去触发对应的处理函数,所以就需要使用到函数防抖与函数节流来帮助我们实现我们想要的结果以及避免不必

  • 本文向大家介绍浅析JavaScript 函数防抖和节流,包括了浅析JavaScript 函数防抖和节流的使用技巧和注意事项,需要的朋友参考一下 函数防抖和节流都是对高频动作触发回调函数的一个优化,实现方式上有类似之处。先从使用场景做个区分。 防抖使用场景: 表单输入框校验 提交按钮避免重复提交 节流使用场景: scroll,mousemove,resize等 函数防抖(debounce) 表单输入

  • useWindowResize的代码如下,如何加防抖,优化效率,减少触发次数