HTML5视频断点续传需开发者主动实现:监听timeupdate、visibilitychange和beforeunload事件保存进度,加载时读取localStorage并设置currentTime,注意防抖、时长校验及跨设备同步限制。
HTML5 视频播放器本身不自动保存播放进度,断点续传需开发者主动监听、存储和恢复播放位置。核心在于准确捕获用户离开前的播放时间点,并在下次加载时跳转到该位置。
利用 timeupdate 事件周期性获取当前播放时间(推荐每5–10秒存一次,避免频繁写入),结合 visibilitychange 和 beforeunload 事件确保页面卸载前最后一次保存:
video.addEventListener('timeupdate', () => {...}),用 localStorage 或 IndexedDB 存储 video.currentTime
document.addEventListener('visibilitychange', () => { if (document.hidden) saveProgress(); }) 中触发保存window.addEventListener('beforeunload', saveProgress) 作为兜底(注意:Safari 对此限制较严,不能依赖它单独工作)页面初始化时,先读取本地存储的进度值,再设置 currentTime 并调用 play()(需用户交互后才能自动播放):
localStorage.getItem('videoProgress_视频ID') 读取时间戳(建议带视频唯一标识,如 URL hash 或 data-id)video.currentTime = savedTime,然后监听 loadedmetadata 事件确保元数据就绪后再跳转play()(避免被浏览器静音策略拦截)实际使用中需规避常见陷阱:
立即学习“前端免费学习笔记(深入)”;
video.duration 与上次保存时长,差异过大则忽略旧进度localStorage 是隔离的,如需同步需接入后端账户体系,前端只负责上传/拉取进度visibilitychange + pagehide(兼容性更好)以下为简化但可用的实现片段:
const video = document.getElementById('myVideo');const key = `videoProgress_${video.dataset.id || video.src}`;function saveProgress() { if (video.currentTime > 0 && !isNaN(video.duration)) { localStorage.setItem(key, video.currentTime.toString()); }}// 防抖保存(避免 timeupdate 过于频繁)let saveTimer;video.addEventListener('timeupdate', () => { clearTimeout(saveTimer); saveTimer = setTimeout(saveProgress, 8000);});['visibilitychange', 'pagehide'].forEach(evt => { document.addEventListener(evt, () => { if (document.hidden || evt === 'pagehide') saveProgress(); });});// 加载后恢复video.addEventListener('loadedmetadata', () => { const saved = localStorage.getItem(key); if (saved && parseFloat(saved) < video.duration) { video.currentTime = parseFloat(saved); }});