节流在视频进度条中通过限制timeupdate事件回调频率(如每300ms或requestanimationframe节奏)来避免频繁dom操作导致的卡顿;拖拽时需禁用节流以实现即时反馈。

节流(Throttle)在视频进度条场景中,核心是控制 timeupdate 事件回调的执行频率,避免每几十毫秒就触发一次 DOM 更新(比如拖拽时频繁设置 progress.value 或重绘时间文本),从而提升性能、减少卡顿。
为什么不能直接监听 timeupdate 并实时更新?
timeupdate 在视频播放时可能每 100–250ms 触发一次(取决于浏览器和编码),若每次都在回调里操作 DOM(如修改 input 的 value、更新 span 文本),尤其在低端设备或复杂页面中容易引发布局抖动或掉帧。节流不是“去掉更新”,而是“有节奏地更新”——比如固定每 300ms 同步一次进度,人眼几乎无感,但 JS 负担显著降低。
用闭包 + 时间戳实现轻量节流函数
不依赖 Lodash,手写一个专注视频场景的节流工具:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function throttleVideoUpdate(fn, delay = 300) {
let lastTime = 0;
return function(...args) {
const now = Date.now();
if (now - lastTime >= delay) {
fn.apply(this, args);
lastTime = now;
}
};
}
<p>// 使用示例
const video = document.getElementById('myVideo');
const progress = document.getElementById('progressBar');</p><p>const updateProgress = throttleVideoUpdate(() => {
progress.value = (video.currentTime / video.duration) * 100;
document.getElementById('currentTime').textContent = formatTime(video.currentTime);
});</p><p>video.addEventListener('timeupdate', updateProgress);
</p>注意:拖拽交互需额外处理(防节流干扰)
用户拖动进度条时,希望“所见即所得”,此时应临时关闭节流,让更新立即生效:
- 监听
input或change事件(针对<input type="range">) - 拖拽中调用
video.currentTime = ...后,立刻手动更新 UI,不走节流逻辑 - 可加标志位区分来源:
isDragging为 true 时跳过节流
更稳妥的做法:用 requestAnimationFrame 替代固定延迟
相比时间戳节流,requestAnimationFrame 更贴合渲染节奏,且自动适配屏幕刷新率(通常 60fps):
let isUpdating = false;
function updateProgressRAF() {
if (isUpdating) return;
isUpdating = true;
requestAnimationFrame(() => {
progress.value = (video.currentTime / video.duration) * 100;
document.getElementById('currentTime').textContent = formatTime(video.currentTime);
isUpdating = false;
});
}
<p>video.addEventListener('timeupdate', updateProgressRAF);
</p>这种方式天然限频(≈16ms/次),比手动设 300ms 更平滑,也更适合动画类更新。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










