当前位置:首页 > JavaScript

js 实现防抖

2026-01-30 23:40:46JavaScript

防抖的概念

防抖(Debounce)是一种优化高频触发事件的技术,确保事件在停止触发后的指定时间内只执行一次。常用于输入框搜索、窗口大小调整等场景。

js 实现防抖

基础实现

使用定时器延迟执行函数,若在延迟期间再次触发,则清除之前的定时器重新计时:

js 实现防抖

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

立即执行版本

支持首次触发立即执行,后续触发需等待延迟结束后才能再次执行:

function debounce(func, delay, immediate) {
  let timer;
  return function(...args) {
    if (immediate && !timer) {
      func.apply(this, args);
    }
    clearTimeout(timer);
    timer = setTimeout(() => {
      timer = null;
      if (!immediate) {
        func.apply(this, args);
      }
    }, delay);
  };
}

取消功能扩展

增加取消延迟执行的方法:

function debounce(func, delay) {
  let timer;
  function debounced(...args) {
    clearTimeout(timer);
    timer = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  }
  debounced.cancel = () => clearTimeout(timer);
  return debounced;
}

使用示例

const searchInput = document.getElementById('search');
const debouncedSearch = debounce(function(e) {
  console.log('Search value:', e.target.value);
}, 500);

searchInput.addEventListener('input', debouncedSearch);

// 需要取消时
// debouncedSearch.cancel();

注意事项

  • 确保func函数的上下文(this)正确绑定
  • 频繁操作时内存中的定时器会被及时清理
  • 延迟时间需根据实际场景调整(通常200-500ms)

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

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Pro…

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Jav…

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…