实现跨页面音乐连续播放功能
最近有一个需求:让音乐播放器在用户浏览不同页面时保持连续播放,而不是每次页面跳转都中断重新开始。
核心实现
实现逻辑非常简洁,主要包含以下几个部分:
1. 状态保存
监听音频的播放、暂停和进度事件,实时将状态保存到 sessionStorage:
// 监听播放事件
audioPlayer.addEventListener('play', () => {
sessionStorage.setItem('isPlaying', 'true');
});
// 监听暂停事件
audioPlayer.addEventListener('pause', () => {
sessionStorage.setItem('isPlaying', 'false');
});
// 监听播放进度
audioPlayer.addEventListener('timeupdate', () => {
sessionStorage.setItem('audioCurrentTime', audioPlayer.currentTime);
});
// 页面卸载前保存最终状态
window.addEventListener('beforeunload', () => {
sessionStorage.setItem('audioCurrentTime', audioPlayer.currentTime);
sessionStorage.setItem('isPlaying', isPlaying);
});
2. 状态恢复
页面加载时,检查 sessionStorage 中是否有之前的播放记录,如果有则自动恢复:
// 恢复播放状态
if (sessionStorage.getItem('isPlaying') === 'true') {
audioPlayer.play().catch(error => {
console.warn('自动播放被阻止:', error);
});
}
// 恢复播放位置
if (sessionStorage.getItem('audioCurrentTime')) {
audioPlayer.currentTime = parseFloat(sessionStorage.getItem('audioCurrentTime'));
}
现代浏览器对自动播放有严格限制,通常需要用户交互才能播放音频。在这个实现中:
- 用户在第一个页面点击播放后,浏览器会认为该站点已获得授权
- 后续页面跳转时,由于是同站点的会话延续,大多数情况下可以自动播放
- 如果自动播放被阻止,用户只需点击页面任意位置即可继续播放