失焦时立即触发防抖操作需封装支持flush的防抖函数,在blur事件中调用flush方法清空定时器并执行最后一次缓存的参数。

在输入框失焦(blur)时立即触发尚未执行的防抖操作,核心思路是:**在防抖函数中保留定时器引用,并在 blur 事件中手动清除延迟、立即执行回调**。
1. 防抖函数需支持“立即执行挂起任务”
标准防抖通常只做延迟重置,要支持失焦即执行,得暴露一个“取消延迟并立刻运行”的方法。推荐封装一个带 flush 能力的防抖:
function debounce(func, wait) {
let timeout = null;
const debounced = function(...args) {
clearTimeout(timeout);
timeout = setTimeout(() => {
func.apply(this, args);
timeout = null;
}, wait);
};
// 新增 flush 方法:清空定时器并立即执行最后一次调用
debounced.flush = function() {
if (timeout) {
clearTimeout(timeout);
timeout = null;
func.apply(this, arguments); // 注意:这里用的是最后一次调用的参数(可优化为缓存)
}
};
return debounced;
}
2. 绑定输入与失焦事件
将防抖函数同时用于 input(或 change)和 blur:
const search = debounce((value) => {
console.log('发起搜索:', value);
// 实际请求或处理逻辑
}, 300);
const input = document.getElementById('search-input');
input.addEventListener('input', () => {
search(input.value);
});
input.addEventListener('blur', () => {
search.flush(); // 失焦时强制触发未完成的搜索
});
3. 更健壮的实现(缓存参数 + this 绑定)
上面的 flush 默认用当前 arguments,但可能不是最后一次输入值。更稳妥的做法是缓存最近一次参数:
function debounce(func, wait) {
let timeout = null;
let lastArgs = [];
let lastThis = null;
const debounced = function(...args) {
lastThis = this;
lastArgs = args;
clearTimeout(timeout);
timeout = setTimeout(() => {
func.apply(lastThis, lastArgs);
timeout = null;
lastArgs = [];
}, wait);
};
debounced.flush = function() {
if (timeout) {
clearTimeout(timeout);
timeout = null;
if (lastArgs.length) {
func.apply(lastThis, lastArgs);
lastArgs = [];
}
}
};
return debounced;
}
4. 注意事项
-
避免重复触发:失焦时调用
flush后,不要再额外调用debounced(),否则可能重复执行 -
与
change事件区分:input实时响应,change只在值改变且失焦后才触发;若只需失焦提交,直接用change更简单,无需防抖 -
清空逻辑一致性:确保
flush和定时器内的执行逻辑完全一致(比如都校验非空、都 trim)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











