防抖

防抖:在频繁动作的事件中,让事件结束后再等待一段时间后执行。

  1. /*
  2. * 滚动完后,多少秒执行一次
  3. * 通过 锁 和 闭包思路解决
  4. */
  5. <!DOCTYPE html>
  6. <html lang="en">
  7. <head>
  8. <meta charset="UTF-8">
  9. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  10. <title>Document</title>
  11. <style>
  12. div {
  13. width: 100vw;
  14. height: 20vh;
  15. background: cyan;
  16. display: flex;
  17. justify-content: center;
  18. align-items: center;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <div></div>
  24. </body>
  25. </html>
  26. <script>
  27. // 函数防抖: 在这个事件触发完后的一段时间执行。
  28. document.querySelector('div').onmousemove = debounce(function () {
  29. console.log(1);
  30. console.log(this);
  31. }, 300)
  32. function debounce(fun, delay) {
  33. let time = null;
  34. let _this = this;
  35. let args = arguments;
  36. console.log(_this);
  37. return function () {
  38. // 进来先清空
  39. clearTimeout(time);
  40. time = setTimeout(() => {
  41. console.log(_this);
  42. fun.apply(_this, args)
  43. }, delay)
  44. }
  45. }
  46. </script>

节流

节流:在执行的事件中每隔一段时间执行一次。

<!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>
    div {
      width: 100vw;
      height: 20vh;
      background: cyan;
      display: flex;
      justify-content: center;
      align-items: center;
    }
  </style>
</head>

<body>
  <div></div>
</body>

</html>
<script>
  // 节流: 让这个函数在触发过程中每间隔一段直接执行一次
  function throttle(fun, delay) {
    let bool = true;
    return function () {
      // 关闭停止
      if (!bool) return
      bool = false;
      setTimeout(() => {
        fun.apply(this, arguments)
        bool = true
      }, delay)
    }
  }
  let num = 0;
  document.querySelector('div').onmousemove = throttle(function () {
    this.innerHTML = num++
  }, 1000)

</script>