当前位置:首页 > JavaScript

js 实现防抖

2026-03-01 14:43:59JavaScript

防抖的实现原理

防抖(Debounce)是一种优化高频触发事件的技术,确保事件在停止触发一段时间后才会执行回调函数。适用于输入框搜索、窗口大小调整等场景。

基础防抖函数实现

function debounce(func, delay) {
  let timeoutId;
  return function(...args) {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
}
  • func: 需要防抖的实际执行函数
  • delay: 防抖延迟时间(毫秒)
  • 每次调用都会清除之前的定时器,重新计时

立即执行版本

有些场景需要首次触发立即执行,后续触发才防抖:

function debounceImmediate(func, delay, immediate = true) {
  let timeoutId;
  return function(...args) {
    const callNow = immediate && !timeoutId;
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => {
      timeoutId = null;
      if (!immediate) func.apply(this, args);
    }, delay);
    if (callNow) func.apply(this, args);
  };
}

TypeScript 实现

增加类型安全的版本:

js 实现防抖

function debounce<T extends (...args: any[]) => void>(
  func: T,
  delay: number
): (...args: Parameters<T>) => void {
  let timeoutId: ReturnType<typeof setTimeout>;
  return (...args: Parameters<T>) => {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => {
      func(...args);
    }, delay);
  };
}

使用示例

const handleSearch = debounce((query) => {
  console.log('Searching for:', query);
  // 实际搜索逻辑
}, 500);

document.getElementById('search-input').addEventListener('input', (e) => {
  handleSearch(e.target.value);
});

注意事项

  • 防抖函数返回的新函数需要保持原始函数的 this 上下文,因此使用 apply
  • 对于需要取消的防抖操作,可以扩展返回取消方法
  • 延迟时间需要根据实际场景调整,通常搜索建议用 300-500ms,UI 调整用 100ms

标签: 防抖js
分享给朋友:

相关文章

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 /…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…