js之防抖、节流函数

2023-04-12 15:52:19 浏览数 (1)

防抖和节流是前端中常见的两个概念,通常用于前端的优化。

防抖: 就是指触发事件后在n秒内函数只能执行一次,如果在n秒内又触发了事件,则会重新计算函数执行时间。(延时器 重新计时) 节流: 就是指连续触发事件但是在设定的一段时间内中只执行一次函数。(定时器)

代码语言:javascript复制
<!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>
  <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
  <input type="text" class="ipt">
  <button class="btn">按钮</button>
  <script>

    // 防抖:出发时间后,延迟一段时间,再执行回调,如果在此期间,事件又被触发,则重新计时
    // 核心:延时器   重新计时
    let timerId = null  // 声明一个延时器
    document.querySelector('.ipt').addEventListener('input', function (){
      let text = this.value
      clearTimeout(timerId) // 用户再输入,清掉延时器,重新开启一个新的
      timerId = setTimeout(() => {
        axios.get('http://www.liulongbin.top:3006/api/sug').then(res => {
          console.log(res);
        })
      }, 1000)
    })


    // 节流:单位时间内,频繁触发同一个操作,只触发一次。(定时器实现)
    // 当触发事件的时候,如果没有设置执行回调函数的定时器,就创建一个。当定时器中的回调函数被执行的时候, 将指向定时器引用的timeout设置为null,那么下一此再执行时,又会重新触发并设置一个定时器。
    let timer = null
    document.querySelector('.btn').addEventListener('click', function () {
      if(!timer) {
        timer = setTimeout(() => {
          timer = null
          axios.get('http://www.liulongbin.top:3006/api/sug').then(res => {
          console.log(res)
          })
        },1000)
      }
    })


  </script>
</body>
</html>

0 人点赞