feat(audio): 优化背景音乐播放控制
- 实现音频状态的本地存储与恢复功能 - 添加定期自动保存播放状态机制 - 支持页面加载时恢复上次播放位置 - 增强自动播放逻辑,提升用户体验 - 监听多种用户交互事件触发音频播放 - 添加音频播放结束后的自动重播功能 - 优化静音与播放状态切换逻辑 - 提升移动端触摸事件对音频控制的支持
This commit is contained in:
@@ -1269,7 +1269,7 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// --- 音频播放控制优化脚本 (保持原样) ---
|
// --- 音频播放控制优化脚本 ---
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
const audio = document.getElementById('bg-music');
|
const audio = document.getElementById('bg-music');
|
||||||
const audioControl = document.getElementById('audio-control');
|
const audioControl = document.getElementById('audio-control');
|
||||||
@@ -1278,6 +1278,47 @@
|
|||||||
let isPlaying = false;
|
let isPlaying = false;
|
||||||
let isMuted = true;
|
let isMuted = true;
|
||||||
|
|
||||||
|
// 确保音频循环播放
|
||||||
|
audio.loop = true;
|
||||||
|
|
||||||
|
// 保存音频状态到 localStorage
|
||||||
|
function saveAudioState() {
|
||||||
|
localStorage.setItem('bgMusicState', JSON.stringify({
|
||||||
|
isPlaying: isPlaying && !audio.paused,
|
||||||
|
isMuted: isMuted,
|
||||||
|
currentTime: audio.currentTime
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从 localStorage 恢复音频状态
|
||||||
|
function restoreAudioState() {
|
||||||
|
try {
|
||||||
|
const savedState = localStorage.getItem('bgMusicState');
|
||||||
|
if (savedState) {
|
||||||
|
const state = JSON.parse(savedState);
|
||||||
|
isMuted = state.isMuted;
|
||||||
|
audio.muted = isMuted;
|
||||||
|
|
||||||
|
// 如果之前正在播放,则尝试继续播放
|
||||||
|
if (state.isPlaying) {
|
||||||
|
setTimeout(() => {
|
||||||
|
audio.play().catch(e => console.log("Restore playback failed:", e));
|
||||||
|
}, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateAudioState();
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log("Failed to restore audio state:", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 页面加载时尝试恢复音频状态
|
||||||
|
restoreAudioState();
|
||||||
|
|
||||||
|
// 定期保存音频状态
|
||||||
|
setInterval(saveAudioState, 5000); // 每5秒保存一次
|
||||||
|
|
||||||
function updateAudioState() {
|
function updateAudioState() {
|
||||||
audio.muted = isMuted;
|
audio.muted = isMuted;
|
||||||
if (isPlaying) {
|
if (isPlaying) {
|
||||||
@@ -1289,6 +1330,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 尝试自动播放音频
|
||||||
try {
|
try {
|
||||||
const playPromise = audio.play();
|
const playPromise = audio.play();
|
||||||
if (playPromise !== undefined) {
|
if (playPromise !== undefined) {
|
||||||
@@ -1308,6 +1350,8 @@
|
|||||||
isMuted = true;
|
isMuted = true;
|
||||||
updateAudioState();
|
updateAudioState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 自动播放函数
|
||||||
function autoPlay() {
|
function autoPlay() {
|
||||||
audio.play().then(() => {
|
audio.play().then(() => {
|
||||||
isPlaying = true;
|
isPlaying = true;
|
||||||
@@ -1317,6 +1361,8 @@
|
|||||||
console.error("Autoplay failed:", e);
|
console.error("Autoplay failed:", e);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 控制音频播放/暂停和静音
|
||||||
audioControl.addEventListener('click', function () {
|
audioControl.addEventListener('click', function () {
|
||||||
if (audio.paused && !isPlaying) {
|
if (audio.paused && !isPlaying) {
|
||||||
audio.play().then(() => {
|
audio.play().then(() => {
|
||||||
@@ -1338,10 +1384,40 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 用户交互时尝试播放音频
|
||||||
document.addEventListener('click', autoPlay);
|
document.addEventListener('click', autoPlay);
|
||||||
document.addEventListener('keydown', autoPlay);
|
document.addEventListener('keydown', autoPlay);
|
||||||
audio.addEventListener('play', () => { isPlaying = true; updateAudioState(); });
|
document.addEventListener('touchstart', autoPlay, { passive: true });
|
||||||
audio.addEventListener('pause', () => { isPlaying = false; updateAudioState(); });
|
|
||||||
|
// 监听音频事件
|
||||||
|
audio.addEventListener('play', () => {
|
||||||
|
isPlaying = true;
|
||||||
|
updateAudioState();
|
||||||
|
saveAudioState();
|
||||||
|
});
|
||||||
|
|
||||||
|
audio.addEventListener('pause', () => {
|
||||||
|
isPlaying = false;
|
||||||
|
updateAudioState();
|
||||||
|
saveAudioState();
|
||||||
|
});
|
||||||
|
|
||||||
|
audio.addEventListener('ended', () => {
|
||||||
|
// 音频结束时重新播放(作为额外保障)
|
||||||
|
if (!audio.loop) {
|
||||||
|
audio.currentTime = 0;
|
||||||
|
audio.play().catch(e => console.error("Replay failed:", e));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 监听时间更新事件,用于保存播放位置
|
||||||
|
audio.addEventListener('timeupdate', () => {
|
||||||
|
// 每10秒保存一次状态
|
||||||
|
if (Math.floor(audio.currentTime) % 10 === 0) {
|
||||||
|
saveAudioState();
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<script>
|
<script>
|
||||||
|
|||||||
Reference in New Issue
Block a user