JS防抖节流

JS防抖和节流

    在进行窗口的resize、scroll,输入框内容校验等操作时,如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕。此时我们可以采用debounce(防抖)和throttle(节流)的方式来减少调用频率,同时又不影响实际效果

函数防抖

    当持续触发事件时,一定时间段内没有触发事件,才会执行一次事件触发函数,如果设定的时间来到之前,又出发了一次事件,就重新开始延时

如下图,持续触发scroll事件,不会触发事件函数,只有当一定时间段内没有触发事件,才会执行一次事件触发函数。


var timer;    //undefined

window.onscroll = function(){

    //如果当前timer不是空,说明前面有一个等待的请求还未发送,就停止前面的等待

    if(timer !== undefined){}

        clearTimeout(timer);

};

//再重新开始下一轮等待

timer = setTimerout(function(){

    //当200ms内,未发生滚动时,才发送正式的ajax请求

    console.log("发送ajax请求,加载更多数据...")

},200);

函数节流

    当持续触发事件时,保证一段时间内只执行一次触发函数

<body>

    <button id="btn">加载更多<button>

</body>

<script>

    var canClick = true;    //全局开关变量

    btn.onclick=function(){    

    if(canClick){    //如果当前开关开着说明可以单击

         canClick = false;     //先关闭开关 

        //再发请求

        console.log("发送ajax请求,加载更多信息...")

        setTimeout(function(){

            console.log("加载完成")

            //在函数的结尾打开开关准备下一次单击

            canClick = true;

        },2000)

    }

}

</script>

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 防抖理解:将多次操作合并为一次操作进行。原理是维护一个计时器,规定在delay时间后触发函数,但是在delay时间...
    aatter阅读 1,859评论 0 0
  • 防抖(debounce) 思路:在第一次触发事件时,不立即执行函数,而是给出一个期限值比如200ms,然后: 如果...
    alanwhy阅读 5,228评论 0 21
  • 什么是防抖节流 为了防止某个特定的函数(尤其是内部有异步操作)在未得到结果前被重复执行,或者想要用户输入、页面滚动...
    fyAgent阅读 4,894评论 0 0
  • 一.什么是函数防抖&节流 函数防抖函数防抖(debounce):在事件被触发n秒后再执行回调,如果在这n秒内又被触...
    王蕾_fd49阅读 3,207评论 0 1
  • 对我这种毫无经验的妈妈,这一学期在喜悦 愤怒 徘徊 反思中悄悄地渡过,我常常问自己是不是我的方法不对🤔️🤔️...
    廖小娜阅读 2,920评论 0 0