seekable属性不能直接跳转,仅标识可跳转时间段,真正跳转靠currenttime;它返回timeranges对象,需遍历区间判断目标时间是否合法,再赋值currenttime实现跳转。

Video标签的seekable属性本身**不能直接实现跳转**,它只是告诉你“当前哪些时间段是可跳转的”,真正执行跳转靠的是currentTime属性。精准跳转的关键,在于理解seekable返回的时间范围、判断目标时间是否合法,并在合适时机触发跳转。
什么是 seekable 属性?
seekable是一个TimeRanges对象,表示浏览器当前已缓冲(或可随机访问)的时间区间。它不是布尔值,也不是单个数字,而是一组可能不连续的时间段,例如:[0.0, 125.8), [200.1, 312.5) —— 表示0秒到125.8秒之间可以跳转,200.1秒到312.5秒之间也可以,但中间那段不行。
常用方法:
• seekable.length:有多少个可跳转区间
• seekable.start(index):第index个区间的起始时间(秒)
• seekable.end(index):第index个区间的结束时间(秒)
如何判断目标时间是否可跳转?
不能直接给currentTime赋值就完事,得先检查目标时间t是否落在某个seekable区间内。否则会触发seeking事件但实际卡住,甚至抛出InvalidStateError(尤其在未加载元数据或未就绪时)。
推荐做法:
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- 监听
loadedmetadata和canplay事件,确保视频基本就绪 - 调用
video.seekable获取当前可跳转范围 - 遍历每个区间:
if (t >= seekable.start(i) && t → 合法 - 若不合法,可降级处理:跳转到最近的合法时间点(如取
seekable.end(0)),或提示用户“该位置暂未加载”
如何安全执行精准跳转?
即使时间合法,也要注意时机。常见错误是在seekable为空(比如刚设置src还没加载)时强行跳转。
稳妥写法示例(无框架纯JS):
function safeSeek(video, targetTime) {
if (!video.readyState || video.readyState safeSeek(video, targetTime), { once: true });
return;
}
const seekable = video.seekable;
let canSeek = false;
for (let i = 0; i = seekable.start(i) && targetTime 0) {
video.currentTime = seekable.start(0);
}
}
}
注意:currentTime设值后会立即触发seeking事件,跳转完成后触发seeked事件——可用它做后续操作(如更新UI进度条)。
实际使用中的关键细节
• seekable是动态变化的:随着缓冲推进,区间会变长、合并,甚至新增(如启用分片加载)
• HLS / MSE 流媒体中,seekable更依赖播放器内部缓冲管理,原生<video></video>可能只暴露部分范围
• 移动端Safari对seekable支持较弱,某些情况下始终返回空范围,需配合buffered属性兜底判断
• 精准到帧?HTML5不保证帧级精度,currentTime最小单位是毫秒,且受编码GOP结构影响;关键帧附近跳转才最稳定
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










