JS防抖与节流

防抖 : (延迟执行,过 delay 秒再执行)

延迟执行

HTML部分

    <input type="button" id="btn" value="提交">

JS

btn.onclick = debounced(function() {
            console.log(1111)
        }, 2000)


// fn是需要防抖执行的函数
// delay是单位时间,:是否立即执行
        function debounced(fn, delay) {
            var timer;    //定时器
            return function() {
                // 如果定时器存在,就关闭定时器
                if(timer) clearTimeout(timer);
                timer = setTimeout(function() {
                    fn.call(this)  //执行fn函数
                }.bind(this), delay)
            }
        }

防抖 :

(立即执行,只有每次(过了几秒之后)第一次调用这个函数时才会执行一次)

HTML部分

 <input type="button" id="btn" value="提交">

JS

防抖: 立即执行

// 防抖: 立即执行
        //(先立即执行一次,只有每次(过了传参几秒之后)再次调用这个函数时才又会执行第二次,依次类推)
        function debounced(fn,delay){
            var timer;
            return function(){
                if(timer) clearTimeout(timer);//取消之前的定时器
                var flag=!timer;  //类型转换
                timer=setTimeout(()=>{  //增加一个定时器
                    timer=null;   //清空当前定时器的句柄
                },delay)
                if(flag) fn.call(this);//第一次执行
            }
        }

节流

定时器方法 主用PC端

//滚动条事件
window.onscroll=throttle(function(){
            console.log(222222222)
        },2000)

        // 节流: fn是需要节流执行的函数,delay是单位时间
        function throttle(fn, delay) {
            var timer = null
            return function () {
                // 判断当前是否存在定时器,如果不存在,就添加一个定时器,执行目标函数,执行完目标函数之后,再将定时器清空
                if (!timer) {
                    timer = setTimeout(function () {
                        timer=null
                        fn.call(this)
                    }.bind(this), delay)
                }
            }
        }

时间戳方法 主用移动端

window.onscroll=throttle(function(){
            console.log(222222222)
        },2000)

        //时间戳   节流
        function throttle(fn, delay) {
            var prev=0;  //上次纪录的时间
            return function(){
                var now=Date.now();  //当前时间
                if(now-prev>delay){  //当前时间-上次时间>等待时间
                    fn.call(this)  //执行函数  发送请求
                    prev=now;  //重置上次记录时间
                }
            }
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在上周的开发中,又遇到点击保存多次请求数据重复的问题,所以下来学习了一下js的防抖和节流。通过学习了解到,在进行窗...
    any_5637阅读 3,021评论 0 2
  • 参考博客:JS防抖和节流,感谢作者的用心分享日常开发过程中,滚动事件做复杂计算频繁调用回调函数很可能会造成页面的卡...
    上海_前端_求内推阅读 3,362评论 0 4
  • 在进行窗口的resize、scroll,输入框内容校验等操作时,如果事件处理函数调用的频率无限制,会加重浏览器的负...
    iqing2012阅读 4,221评论 0 1
  • 一、什么是防抖和节流 Ps: 比如搜索框,用户在输入的时候使用change事件去调用搜索,如果用户每一次输入都去搜...
    拾柒_aab0阅读 2,241评论 0 1
  • 防抖 防抖是js优化的重要的一部分,也是面试中手写代码最常考的题目。那么我们为什么要防抖?防抖是什么意思?比如我们...
    理发师Tony阅读 8,666评论 0 22

友情链接更多精彩内容