手撕防抖,节流

92 阅读1分钟

首先我们要了解一下防抖节流是干什么用的

他们都是前端性能优化的一种手段

防抖: 他是持续触发的时候不执行, 不触发的一定时间后才执行

节流: 持续触发也执行,只不过,执行的频率变低了

他们大多用在电商项目中

防抖

当事件被触发 n 秒后再执行回调, 如果在n秒内有被触发, 则重新计时

使用场景: 频繁触发按钮点击事件, input框搜索 开始手撕防抖

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div>
    <input type="text">
  </div>
  <script>
    let time = null
    // 获取input框,并注册input事件
      document.querySelector('input').addEventListener('input', function(){
        // 每次监听到有输入就删除定时器
      clearTimeout(time)
      // 开启定时器
      time = setTimeout(()=> {
        console.log(this.value);
      }, 1000)
    })
  </script>
</body>
</html>

节流

规定在一个单位时间内只能触发一次函数,  如果在单位时间内触发多次, 只执行一次

使用场景: 下拉加载更多 ( 无线滚动事件 ) , 浏览器的resize , scroll 事件, 鼠标持续触发事件

开始手撕节流

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>

    <script>
        let oldTime = +new Date()
        window.addEventListener('scroll',(e)=>{
          const newTime = +new Date()
          const scrollTop = document.body.scrollTop+document.documentElement.scrollTop;
          if(newTime - oldTime > 500){
            console.log(scrollTop)
            oldTime = newTime
          }
        })
    </script>
  </body>
</html>