下拉加载用防抖的核心是“等用户真正停下滑动再判断是否到底部”,而非防重复;它将高频滚动检查收敛为停止后一次执行,比节流更契合触底加载时机,需配合加载锁、阈值余量及监听器清理。

下拉加载更多时用防抖,核心不是“防重复”,而是“等用户真正停下滑动再判断是否到底部”。因为滚动事件(scroll)每秒可能触发几十次,如果每次触发都检查是否触底并发起请求,会造成大量无效判断甚至重复请求。防抖的作用是把高频的滚动检查收敛为一次——只在用户停止滚动后执行。
为什么滚动加载适合用防抖而不是节流
滚动加载的关键时机是“用户停下来、页面刚好在底部”那一瞬间。节流会固定间隔执行(比如每300ms查一次),但用户可能只滑了半屏就停了,这时节流仍会反复检查;而防抖只关心“最后停在哪”,更符合业务逻辑——用户不动了,才去确认要不要加载。
防抖实现的关键细节
防抖函数本身不关心滚动逻辑,它只是控制执行节奏。真正起作用的是:把“判断是否触底 + 发起加载”的整套逻辑包裹进防抖函数里,并确保每次滚动都触发这个防抖后的函数。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 延迟时间建议设为 100~200ms:太短起不到收敛作用,太长会让加载有明显卡顿感
- 不要在防抖函数里直接写
fetch,而是封装一个加载函数(如loadMore()),再传给防抖 - 需配合触底检测逻辑使用,例如:
window.innerHeight + window.scrollY >= document.documentElement.scrollHeight - 10 - 注意防抖函数要绑定正确的
this和参数,推荐用箭头函数或显式传参方式调用
一个可直接用的示例
以下代码监听滚动,在用户停止滚动后检查是否触底,满足条件则加载下一页:
function debounce(fn, delay) {
let timer;
return function(...args) {
clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, args), delay);
};
}
<p>function checkAndLoad() {
const { scrollTop, clientHeight } = document.documentElement;
const maxHeight = document.body.scrollHeight;
if (scrollTop + clientHeight >= maxHeight - 50) {
loadMore(); // 你的加载逻辑,含 loading 状态控制和分页参数管理
}
}</p><p>const debouncedCheck = debounce(checkAndLoad, 150);
window.addEventListener('scroll', debouncedCheck);
</p>
实际开发中容易忽略的点
光加防抖还不够,还要配合其他机制才能真正防止重复触发:
-
加载状态锁:在
loadMore()开始时设loading = true,请求完成或失败后再置为false,避免多次滚动停顿都触发请求 -
触底阈值留余量:用
-50而不是===,防止因四舍五入或布局抖动导致漏判 -
移除监听器或清理定时器:页面卸载或组件销毁时,记得
window.removeEventListener('scroll', debouncedCheck),避免内存泄漏 -
移动端兼容性:iOS Safari 中
scroll事件可能不及时,可考虑监听touchend后再触发一次检查
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










