zoukankan      html  css  js  c++  java
  • JS定时器实现函数节流和防抖 -简单实现对比 -适用地方

    如题 (总结要点)

    • 防止重复点击!
    • 最近项目中遇见这个“函数抖动”的问题!快速点击前端xx按钮,造成数据多次加载进页面里,正常只显示10条数据,结果显示了20条数据,异常!
    • 出现原因: 前端发送ajax异步请求(异步), 假设发送两次bindData 同时请求,同时清空已有数据,同时接受返回的结果,一个list中便存储了两份数据。手速够快,还可以加进更多分!
    • 解决方案:函数节流!强制2秒内仅执行一次!
    • 原文链接 :

    借鉴学习文章列表

    1.代码: 节流和防抖

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>节流</title>
    </head>
    <body>
    <p>
      <h4>模板 鼠标移动一次计数+1</h4>
      关联文本,绑定,触发鼠标事件
    </p>
    <div id="content" style="height:150px;line-height:150px;text-align:center; color: #fff;background-color:#ccc;font-size:80px;"></div>
    <script type="text/javascript">
      let count =0;
      let content = document.getElementById('content');
      function countNum() {
        count++;
        content.innerHTML = count;
      }
      content.onmousemove = countNum
    </script>
    
    <hr>
    <p>
      <h4>节流思路 </h4>
    每两秒允许触发一次计数时间
    设置一个计数变量‘timeout’,每次执行加法的时候判断timeout是否为0;<br>
      如果为0,则执行加法,将timeout变为2000,设置计数时间,在两秒后置零timeout;<br>
      否则因为timeout没有置零,什么都不做,干等着就行了。<br>
    </p>
    <div id="content2" style="height:150px;line-height:150px;text-align:center; color: #fff;background-color:#ccc;font-size:80px;"></div>
    <script type="text/javascript">
      let count2 = 0;
      let content2 = document.getElementById('content2');
      let timeout=0
      function countNum2() {
        // timeout不为空,则间隔时间还没结束,等着结束
        if(timeout!==0){
          console.log('wait,节流中,2s时间还没有到,什么都不做--')
        }else{
          // 立即执行加法
          count2++;
          content2.innerHTML = count2;
          timeout=2000
          // 设置计数器
          setTimeout(function clearTime() {
            timeout = 0
          }, timeout)
        }
      }
      content2.onmousemove = countNum2
    </script>
    
    <hr>
    <p>
    <h4>防抖思路 </h4>
      冷却时间不够,就重新计算冷却时间,直至冷却时间够了在调用
    </p>
    <div id="content3" style="height:150px;line-height:150px;text-align:center; color: #fff;background-color:#ccc;font-size:80px;"></div>
    <script type="text/javascript">
      let count3 = 0;
      let content3 = document.getElementById('content3');
      let timeout3=0
      let meter
      function countNum3() {
        // timeout不为空,则间隔时间还没结束,等着结束
    
        if(timeout3!==0){
          console.log('wait,防抖,2s时间还没有到,重新开始2s计数')
          // 清空计时器,重新开始计时
          clearTimeout(meter)
          meter = setTimeout(function clearTime() {
            timeout3 = 0
          }, timeout3)
        }else{
          // 立即执行加法
          count3++;
          content3.innerHTML = count3;
          timeout3=2000
          // 设置计数器
          meter = setTimeout(function clearTime() {
            timeout3 = 0
          }, timeout3)
        }
      }
      content3.onmousemove = countNum3
    </script>
    </body>
    </html>
    
    

    2.测试

    3. 适用场景

    以上即可,灵活运用;比如文件下载就防抖(这个比较占用服务器资源,不可频繁下载),页面刷新就节流。

  • 相关阅读:
    无线路由器wds桥接技术+丢包率
    2016CCPC东北地区大学生程序设计竞赛1008/HDU 5929 模拟
    Codeforces Round #375 (Div. 2) A B C 水 模拟 贪心
    Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) A B C D 水 模拟 并查集 优先队列
    Codeforces Round #310 (Div. 2) A B C
    Codeforces Round #374 (Div. 2) A B C D 水 模拟 dp+dfs 优先队列
    Codeforces Round #313 (Div. 2) A B C 思路 枚举 数学
    Codeforces Round #373 (Div. 2) A B C 水 贪心 模拟(四舍五入进位)
    CentOS7 PostgreSQL 安装
    数据库事务的隔离级别
  • 原文地址:https://www.cnblogs.com/zhazhaacmer/p/11271132.html
Copyright © 2011-2022 走看看