美文网首页前端开发那些事儿
防抖和节流的区别和实用场景

防抖和节流的区别和实用场景

作者: Amanda妍 | 来源:发表于2021-06-16 17:49 被阅读0次

防抖和节流

防抖:单位时间内事件触发会被重置,避免事件被误伤触发多次。代码实现重在清零 clearTimeout。触发高频事件,n秒内事件只会执行一次,如果n秒内再次触发,则会重新计算时间

防抖的实用场景:

  • 登录发短信按钮,避免用户多次点击发起多次请求
  • 调整浏览器大小 resize 次数过于频繁,造成计算过多,此时需要一次到位,就用到了防抖
  • 文本编辑器实时保存,当无任何更改操作一秒后进行保存
  • 联想输入法,每次输入之后都有联想词弹出,这个控制联想词的方法就不可能是输入框内容一改变就触发的,他一定是当你结束输入一段时间之后才会触发。
    举例:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            *{
                margin: 0;
                padding: 0;
            }
            .div1{
                width: 200px;
                height: 200px;
                text-align: center;
                line-height: 200px;
                background-color: palegoldenrod;
            }
        </style>
    </head>
    <body>
        <div class="div1"></div>
    </body>
</html>
<script type="text/javascript">
    // 防抖函数
    function debounce (f, wait) {
      let timer;  // 创建一个标记用来存放定时器的返回值

      return (...args) => {
        // 每当用户输入的时候把前一个 setTimeout clear 掉
        clearTimeout(timer)
        // 然后又创建一个新的 setTimeout, 这样就能保证interval 间隔内如果时间持续触发,就不会执行 fn 函数
        timer = setTimeout(() => {
          f(...args)
        }, wait)
      }
    }
    let count = 0;
    let divEl = document.getElementsByClassName("div1")[0];
    function moveFn(){
        divEl.innerHTML = count++;
    }
    // divEl.addEventListener("click", moveFn,false)
    divEl.addEventListener("click", debounce(moveFn, 1000));
    
</script>

节流:顾名思义,控制水的流量。控制事件发生的频率,如控制为1s发生一次,甚至1分钟发生一次。与服务端(server)及网关(gateway)控制的限流 (Rate Limit) 类似。控制流量,单位时间内事件只能触发一次,如果服务器端的限流即 Rate Limit。代码实现重在开锁关锁 timer=timeout; timer=null

节流的实用场景

  • scroll 事件,每隔一秒计算一次位置信息等
  • 浏览器播放事件,每隔一秒计算一次进度信息等
  • input 框实时搜索并发送请求展示下拉列表,每隔一秒发送一次请求 (也可做防抖)
    举例:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            *{
                margin: 0;
                padding: 0;
            }
            .div1{
                width: 200px;
                height: 200px;
                text-align: center;
                line-height: 200px;
                background-color: palegoldenrod;
            }
        </style>
    </head>
    <body>
        <button class="addBtn">点击count++</button>
        <span class="count">0</span>
    </body>
</html>
<script src="/js/jquery.min.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
//节流函数
    function throttle (f, wait) {
      let timer
      return (...args) => {
        if (timer) { return }
        timer = setTimeout(() => {
          f(...args)
          timer = null
        }, wait)
      }
    }
    function addCount(num){
        let initCount = parseInt($(".count").html());
        initCount = initCount+num;
        $(".count").html(initCount);
    }
    /* jq的方式来使用节流代码 */
    $(".addBtn").click(throttle(()=>{addCount(8)}, 2000)) 
    
    
</script>

函数节流不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数,而函数防抖只是在最后一次事件后才触发一次函数。 比如在页面的无限加载场景下,我们需要用户在滚动页面时,每隔一段时间发一次 Ajax 请求,而不是在用户停下滚动页面操作时才去请求数据。这样的场景,就适合用节流技术来实现。

总结:

 防抖:防止抖动,单位时间内事件触发会被重置,避免事件被误伤触发多次。代码实现重在清零 clearTimeout
 节流:控制流量,单位时间内事件只能触发一次,如果服务器端的限流即 Rate Limit。代码实现重在开锁关锁 timer=timeout; timer=null

相关文章

  • 防抖和节流的区别和实用场景

    防抖和节流 防抖:单位时间内事件触发会被重置,避免事件被误伤触发多次。代码实现重在清零 clearTimeout。...

  • React中事件节流防抖

    节流 方法一 方法二 防抖 写法类似。。。 区别 debounce 和 throttle 各有特点,在不同的场景要...

  • 2019-04-24关于节流和防抖

    节流: 应用场景: 防抖: 应用场景: 1.节流 2.防抖

  • 关于防抖和节流的区别和实现

    对于“防抖”和“节流”,之前以为这两个词是一个概念,翻了几篇文章特此写笔记整理一下。 防抖和节流的区别 防抖是.....

  • throttle(节流)和debounce(防抖)

    防抖和节流都是用来控制频繁调用的问题,但是这两种的应用场景是有区别的。 throttle(节流) 有一个调用周期,...

  • 谈谈js中的节流和防抖函数

    关于节流和防抖,这篇文章说的很好了,深入lodash源码分析防抖和节流深入篇 | Lodash 防抖和节流是怎么实...

  • 防抖和节流的区别

    防抖和节流,这俩哥们无论声音相貌长得都非常像,就像孪生兄弟一般,有时候难免混为一谈。但实际上这俩哥们确实有不太一样...

  • JavaScript防抖和节流

    1. 认识防抖和节流 1.1. 对防抖和节流的认识 防抖和节流的概念其实最早并不是出现在软件工程中,防抖是出现在电...

  • 13.防抖与节流

    防抖和节流的一个明显区别就是:一次执行后,防抖可再次执行时间是动态的,节流可再次执行时间是固定的。 防抖 每次事件...

  • 函数节流与函数防抖

    函数节流与函数防抖的区别JS魔法堂:函数节流(throttle)与函数去抖(debounce)函数的防抖与节流 自...

网友评论

    本文标题:防抖和节流的区别和实用场景

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