📜  JavaScript 中的去抖动(1)

📅  最后修改于: 2023-12-03 15:16:09.336000             🧑  作者: Mango

JavaScript中的去抖动

在编写 JavaScript 程序时,有些用户事件(如滚动、拖动、按键等)可能会触发大量的事件处理程序,导致浏览器性能受到影响。去抖动技术被用来解决这个问题,它能够减少事件处理程序的执行次数,提高用户体验。

什么是去抖动?

去抖动是指在一定时间内将多次触发的事件合并为单一事件,并且只触发一次。去抖动可以应用于任何类型的事件,常用于输入框、搜索框、滚动条等。通过去抖动,可以降低事件处理程序的执行次数,从而避免出现性能问题和不必要的计算负载。

实现去抖动的方法

实现去抖动的方法主要包括:

  1. 使用定时器(setTimeout 和 clearTimeout)。
  2. 使用 requestAnimationFrame 函数。
  3. 使用 Lodash(或 Underscore.js)库中的 _.debounce 函数。
  4. 使用自己编写的优化版 debounce 函数。

下面分别介绍这些方法的用法和优缺点。

方法一:使用定时器(setTimeout 和 clearTimeout)

定时器的原理是在事件发生后设定一个定时器,等待一段时间后再执行相应的操作。在这段时间内,如果事件再次发生,则取消前一个定时器,重新设定一个新的定时器。具体实现可以参考以下代码:

function debounce(func, delay) {
  let timer = null;
  return function() {
    const context = this;
    const args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function() {
      func.apply(context, args);
    }, delay);
  }
}

// 调用 debounce 函数
window.addEventListener('scroll', debounce(function() {
  // 实现逻辑
}, 200));

一般情况下,dealy 参数的值可以根据实际需求合理设置,一般最小值建议设置为 200ms。

优点:

  • 可以自定义延迟时间。
  • 容易实现。

缺点:

  • 当事件较为频繁时,可能会有一些事件处理被遗漏。
方法二:使用 requestAnimationFrame 函数

requestAnimationFrame 是浏览器提供的一个函数,用于优化动画渲染效果。它并不像定时器一样能够设定固定的延迟时间,而是只在每个刷新周期执行一次相应的函数。可以参考以下代码:

function debounce(func, delay) {
  let timer = null;
  return function () {
    const context = this;
    const args = arguments;
    cancelAnimationFrame(timer);
    timer = requestAnimationFrame(function() {
      func.apply(context, args);
    });
  };
}

// 调用 debounce 函数
window.addEventListener('scroll', debounce(function() {
  // 实现逻辑
}, 200));

优点:

  • 可以保证在每个刷新周期只执行一次相应的函数。
  • 能够避免事件被遗漏的情况。

缺点:

  • 依赖于 requestAnimationFrame 函数。
方法三:使用 Lodash(或 Underscore.js)库中的 _.debounce 函数

Lodash 和 Underscore.js 是两个比较流行的 JavaScript 库,提供了许多方便开发人员的工具函数。其中 Lodash 的 _.debounce 函数是用来实现去抖动的。可以参考以下代码:

// 导入 Lodash 库
import _ from 'lodash';

// 调用 _.debounce 函数
window.addEventListener('scroll', _.debounce(function() {
  // 实现逻辑
}, 200));

优点:

  • 基于成熟的库,稳定性较高。

缺点:

  • 需要引入外部库,增加了项目依赖。
方法四:使用自己编写的优化版 debounce 函数

根据实际情况,开发人员可以自己编写一个优化版的 debounce 函数,以满足自己的需求。可以参考以下代码:

function debounce(func, wait, immediate) {
  let timer;
  return function() {
    const context = this,
          args = arguments;
    const later = function() {
      timer = null;
      if (!immediate) func.apply(context, args);
    };
    const callNow = immediate && !timer;
    clearTimeout(timer);
    timer = setTimeout(later, wait);
    if (callNow) func.apply(context, args);
  };
}

// 调用 debounce 函数
window.addEventListener('scroll', debounce(function() {
  // 实现逻辑
}, 200));

优点:

  • 可以自定义延迟时间和初始是否立即执行函数。
  • 不依赖外部库。

缺点:

  • 较为复杂,需要对函数编写能力有一定要求。
总结

去抖动技术是一种提高 JavaScript 程序性能的有效手段,通过合并多次触发的事件,减少事件处理程序的执行次数,提高用户体验。在实现去抖动时,可以选择使用定时器、requestAnimationFrame、Lodash 和自己编写的方法。开发人员应该根据实际情况选择最适合自己项目的方法,并合理设置相关参数。