浅谈js的防抖和节流

如果一个事件触发的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕。此时我们可以采用debounce(防抖)和throttle(节流)的方式来减少触发的频率,同时又不影响实际效果。
比如说搜索框的请求优化,搜索的这个需求基本上随处可见,几乎每个项目都会有搜索。
输入搜索词条需要立即触发搜索请求时,防抖和节流可以将多个请求合并为一个请求

现在利用一小例子简单理解一下防抖和节流

首先需要一个盒子
  <!DOCTYPE html>
  <html lang="en">
  <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <style>
          .box {font-size:100px;100%;height:400px;border:4px solid #f00;display:flex;justify-content:center;align-items:center;}

      </style>
  </head>
  <body>
      <div class="box"></div>
  </body>
简单写一个绑定鼠标事件 当鼠标移动时让num++
  var num=0;
  var box=document.querySelector('.box');

  //DOM0级事件绑定--pc端
  //box.onmousemove=debounce(move,2000)

  //DOM2级事件绑定
  box.addEventListener('mousemove',debounce(move,2000),false)

  function move(e) {
      num++;
      this.innerHTML=num;

  }
防抖

简单来说就是防止抖动
当持续触发事件时,debounce 会合并事件且不会去触发事件,当一定时间内没有触发再这个事件时,才真正去触发事件。
防抖主要利用定时器实现

  //用定时器实现防抖
  function debounce(func,wait) {
      var timer=null;
      return function() {
      //保存当前调用的dom对象
       var _this=this;
       //保存事件对象
       var args=arguments;
       clearTimeout(timer)
       timer=setTimeout(function() {
           func.apply(_this,args)
       },wait)
      }      
  }
节流

hrottle(节流),当持续触发事件时,保证隔间时间触发一次事件。
持续触发事件时,throttle 会合并一定时间内的事件,并在该时间结束时真正去触发一次事件。
防抖主要有两种方式实现

第一种:时间戳

//时间戳版本实现节流
function throttle(func,wait) {
    //定义初始时间
    var oldTime=0;
    return function() {
        var _this=this;
        var args=arguments;

        //当前时间戳
        var newTime=+new Date();

        //判断用当前时间减去旧的时间,如果大于wait指定的时间就会触发
        if(newTime-oldTime>wait) {
            //执行触发的函数
            func.apply(_this,args)
            //将旧时间更新
            oldTime=newTime;
        }

    }

第二种:定时器

//时间戳版本实现节流
function throttle(func,wait) {
    var timer=null;
    return function() {
        var _this=this;
        var args=arguments;
       if(!timer) {
            timer=setTimeout(function() {
                timer=null;
                func.apply(_this,args)
            },wait)
       }
    }
}
原文地址:https://www.cnblogs.com/mxnl/p/13593777.html