美文网首页
防抖和节流

防抖和节流

作者: WWWWWWWWWWWWWWM | 来源:发表于2021-04-01 10:26 被阅读0次

    防抖和节流都是解决用户频繁操作的一种解决方案,区别是:

    debounce 防抖

    用户在频繁操作的时候,只有当用户操作结束之后,才触发需要执行的方法(比如设置5s的防抖,意思就是在5s内,不管用户操作了多少次,都不会执行,只有当用户停止操作,5s之后才执行1次);

    • 应用,当用户点击保存的时候,避免用户多次点击保存,下发多个保存接口。
    • 注意:上面说了5s之后才执行,这只是防抖的一种,还有那种先立即执行一次,然后在5s不管你点击几次,都不执行,只有过了5s,在点击才会执行

    throttle 节流

    是用户在频繁操作的时候,用户的操作频率太快,通过设置节流,让用户操作执行的方法频率降低(比如用户设置了5s的节流,用户现在1s中操作一次,那用户第一秒第二秒,第三秒,第四秒的操作都不会执行方法,只有第五秒才会执行)

    • 应用,当用户在滚动页面时,如果需要监听滚动事件,如果不设置节流,会大量执行监听事件,浪费性能,因此需要节流,比如设置500ms,才执行一次
    • 注意:下面这个实现方式是通过时间戳来实现的,还可用用过setTimeout来实现,有多种方式。

    debounce 防抖

    //代码
    function debounce(fn, t) {
        let timer;
        return function () {
            if (timer) {
                clearTimeout(timer);
            }
            timer=  setTimeout(() => {
                fn.apply(this, arguments)
            }, t)
        }
    }
    //应用(此代码意思是在1s内无论点击多少次btn,都不会打印,直至停止后1s)
    <button id="btn">click</button>   //html
    //js
        let btn = document.getElementById('btn');
        btn.onclick = debounce(function() {
            console.log(111)
        }, 1000)
    
    

    throttle 节流

    //代码
    function throttle(fn, t) {
            let t1 = new Date().getTime();
            return function() {
                let t2 = new Date().getTime();
                // console.log(t2, t1)
                if ((t2 - t1) >= t) {
                    fn.apply(this,arguments);
                    t1 = t2;
                }
            }
    }
    //应用(此代码是监听scroll滚动,原先是滚动多次执行,现在是滚动1s中执行一次)
    window.addEventListener('scroll', throttle(function () {
        console.log(123)
    }, 1000))
    
    
    

    相关文章

      网友评论

          本文标题:防抖和节流

          本文链接:https://www.haomeiwen.com/subject/ngttkltx.html