当前位置: 首页 > news >正文

js防抖函数防抖无效的解决方法

 在JavaScript中实现防抖函数:
// 正确传参的防抖实现
function debounce(func, delay) {
  let timer;
  return function(...args) {  // 使用剩余参数接收所有传参
    const context = this;     // 保留函数执行上下文
    clearTimeout(timer);
    timer = setTimeout(() => {
      func.apply(context, args);  // 正确绑定this和传递参数
    }, delay);
  };
}

// 使用示例
const handleSearch = debounce(function(keyword) {
  console.log('Searching:', keyword);
}, 500);

// 事件绑定(注意要直接使用返回的函数)
inputEl.addEventListener('input', (e) => {
  handleSearch(e.target.value);  // 直接调用已创建的防抖函数实例
});
但用户可能这样调用防抖函数:
// 错误示例
function handleInput(value) {
    console.log(value);
}

function debouncedHandle(value) {
    debounce(handleInput(value), 500);
}

input.addEventListener('input', (e) => debouncedHandle(e.target.value));

这会导致每次事件触发时都生成一个新的函数,而不是使用同一个防抖函数实例。这种情况下,定时器无法正确跟踪,防抖失效。

正确的做法应该是确保每次调用的是同一个防抖函数实例:
// 正确示例
function handleInput(value) {
    console.log(value);
}

const debouncedHandle = debounce(handleInput, 500);

input.addEventListener('input', (e) => debouncedHandle(e.target.value));

这样,每次事件触发时都调用同一个debouncedHandle实例,参数会被正确传递,并且防抖逻辑有效。

关键点说明:
  1. 参数接收:使用剩余参数...args接收所有传入参数
  2. 上下文保存:通过闭包保存this上下文,避免箭头函数导致的上下文丢失
  3. 参数传递:使用apply()方法同时传递上下文和参数数组
  4. 实例保持:确保事件处理器中始终调用同一个防抖函数实例

建议将防抖函数实例存储在变量中重复使用,或在React/Vue等框架中使用useRef等Hook保持实例引用。

http://www.dtcms.com/a/108174.html

相关文章:

  • 14.网络套接字TCP
  • 5.好事多磨 -- TCP网络连接Ⅱ
  • LabVIEW多线程
  • API vs 网页抓取:获取数据的最佳方式
  • PyTorch中.pth文件的解析及应用
  • Linux的TCP连接数到达2万,其中tcp_tw、tcp_alloc、tcp_inuse都很高,可能出现什么问题
  • Python `async` 和 `asyncio` 区别; `asyncio.Lock` 和 `threading.Lock`区别
  • pyqt SQL Server 数据库查询-优化2
  • 使用ChromaDB构建RAG知识库
  • SSH远程连接服务器(cursor)
  • ssh私钥文件登录问题:Load key invalid format
  • spring-ai-alibaba第四章阿里dashscope集成百度翻译tool
  • 端到端机器学习流水线(MLflow跟踪实验)
  • Vue3+Vite+TypeScript+Element Plus开发-04.静态菜单设计
  • Java单例模式详解
  • 深入理解 CSS 选择器:从基础到高级的样式控制
  • iPhone 16怎么录制屏幕内容?屏幕录制技巧、软件分享
  • eBest AI智能报表:用自然语言对话解锁企业数据生产力
  • PostgreSQL HAVING 子句详解
  • 最小二乘求解器lstsq,处理带权重和L2正则的线性回归
  • Vue3 + Element Plus + AntV X6 实现拖拽树组件
  • 【人工智能之大模型】如何缓解大语言模型LLMs重复读的问题?
  • 函数ioctl(Input/Output Control)
  • mac如何将jar包上传到maven中央仓库中
  • LeetCode-695. 岛屿的最大面积
  • Linux系统之systemctl管理服务及编译安装配置文件安装实现systemctl管理服务
  • Redis-10.在Java中操作Redis-Spring Data Redis使用方式-操作步骤说明
  • 基于随机森林算法的信用风险评估项目
  • 汇编学习结语
  • Dify案例-接入飞书云文档实现需求质量评估