最可靠方法是用 currentTime 属性修改播放位置,需确保视频已加载元数据(readyState≥2)、处于可寻址范围(seekable),并用 Math.min() 防越界;快进后若暂停需手动 load() 或由用户决定是否播放。

用 currentTime 直接修改播放位置最可靠
HTML5 <video> 元素的 currentTime 属性就是干这个的——它代表当前播放时间(单位:秒),可读可写。只要视频已加载元数据(loadedmetadata 事件触发后),就能安全赋值。
常见错误是点击按钮时视频还没 ready,直接设 currentTime 会静默失败,或者抛出 InvalidStateError。所以得先检查 video.readyState >= 2,或监听 canplay 后再绑定按钮逻辑。
- 快进 10 秒:
video.currentTime = Math.min(video.duration, video.currentTime + 10); - 避免越界:必须用
Math.min()截断到duration,否则设超时会跳回开头(部分浏览器行为) - 注意精度:
currentTime是浮点数,小数点后两位足够,没必要保留更多位
按钮点击触发前先确保视频能播放
很多快进失效,根本不是代码写错,而是视频处于暂停、加载中或被用户手动暂停状态。单纯改 currentTime 不会自动恢复播放。
如果希望“点快进就接着播”,得显式调用 play();但现代浏览器对自动播放有限制(需用户手势触发),所以更稳妥的做法是只改时间,由用户决定是否继续播。
立即学习“前端免费学习笔记(深入)”;
- 推荐组合:
video.currentTime += 10; if (video.paused) { video.load(); }—— 避免因暂停导致时间更新不生效 - 不要在
click里无条件调play(),可能被浏览器拦截并报NotAllowedError - 检查
video.networkState === 0(NETWORK_EMPTY)说明还没加载,此时设currentTime无效
快进按钮要不要加防抖?要看使用场景
连续猛点快进按钮,可能造成多次 currentTime 赋值,但浏览器内部会排队处理,实际效果未必叠加。不过若配合 UI 反馈(比如按钮变灰、显示倒计时),就得控制节奏。
防抖不是必须,但能防止意外连点导致跳过关键片段。尤其当快进步长较大(如 30 秒)时,两次点击间隔小于 200ms 基本没意义。
- 简单防抖写法:
let isJumping = false; function jump(sec) { if (isJumping) return; isJumping = true; video.currentTime += sec; setTimeout(() => isJumping = false, 300); } - 不用防抖也行,但别在按钮上套
disabled状态太久,否则用户误以为卡死 - 移动端点击区域小,防抖比 PC 更有必要
seekable 范围限制快进上限
不是所有时间点都能跳。视频的可寻址范围由 video.seekable 返回的 TimeRanges 对象决定。比如 HLS 流或未完全加载的 MP4,开头几秒可跳,后面可能还不可 seek。
直接设一个 currentTime 到不可 seek 区域,浏览器不会报错,但实际播放位置可能停在最近的 keyframe,甚至卡住不动。
- 检查是否可跳:
if (video.seekable.length > 0) { const end = video.seekable.end(0); if (video.currentTime + 10 -
seekable是动态的,边下边播时范围会增长,不能只查一次 - 遇到不可 seek 情况,建议降级为提示:“内容尚未加载,请稍候再试”
快进逻辑本身很简单,真正麻烦的是各种加载状态、兼容性边界和用户预期之间的落差。尤其是移动端 iOS Safari 对 currentTime 的响应延迟、Chrome 对未播放视频的 seekable 判断不准,这些细节不测真机很难发现。



















