如何节流range input的requestAnimationFrame?实现定时触发回调函数
实现思路与代码示例
我来给你捋捋几个可行的实现思路,顺便调整下代码示例~
核心思路
- 明确定时间隔:先确定你需要的“每隔几秒”具体是多少毫秒,最好把这个间隔作为参数传入
rangeListener方法,这样灵活性更高。 - 用
setInterval实现定时触发:相比requestAnimationFrame(跟着浏览器帧率走),setInterval能精准按照固定时间间隔执行回调,完美匹配你的“每隔x秒获取值”需求。 - 记得清理定时器:一定要保存定时器的ID,在合适的时机(比如range元素被移除、组件销毁)调用
clearInterval,避免内存泄漏。
基础实现代码
下面是调整后的Test类,保留了你原有的逻辑,新增了定时回调的实现:
class Test { // 新增intervalMs参数,默认2秒间隔,可自定义 rangeListener(range, func, step, intervalMs = 2000) { // 原有change事件逻辑保持不变 range.addEventListener("change", function () { func(range.value); }); // 定义定时执行的回调函数 const timedStepCallback = () => { // 如果你的step需要和动画帧同步,就保留requestAnimationFrame window.requestAnimationFrame(function () { step(range.value); }); }; // 创建定时器,每隔指定时间执行回调 const timerId = setInterval(timedStepCallback, intervalMs); // 把定时器ID绑定到range元素上,方便后续清理 range._rangeTimerId = timerId; // 监听range元素被移除的事件,自动清理定时器 range.addEventListener('remove', () => { clearInterval(range._rangeTimerId); }); // 也可以把timerId返回出去,让调用方手动控制启停 // return timerId; } }
进阶优化(可选)
如果想在用户拖动range滑块时暂停定时,拖动结束后再恢复,可以加个启停逻辑,避免不必要的重复执行:
class Test { rangeListener(range, func, step, intervalMs = 2000) { let timerId; // 启动定时器 const startTimer = () => { timerId = setInterval(() => { window.requestAnimationFrame(() => step(range.value)); }, intervalMs); }; // 停止定时器 const stopTimer = () => { clearInterval(timerId); }; // 用户拖动滑块时暂停定时 range.addEventListener('input', stopTimer); // 用户拖动结束后,执行func并重启定时 range.addEventListener("change", function () { func(range.value); startTimer(); }); // 初始化时启动定时 startTimer(); // 元素移除时清理定时器 range.addEventListener('remove', stopTimer); } }
内容的提问来源于stack exchange,提问作者Patrioticcow
相关产品推荐
相关产品推荐

