由于游戏更新,Wiki正在更新页面,当前内容可能并非最新版本,欢迎进群督促!
由于游戏更新,Wiki正在更新页面,当前内容可能并非最新版本,欢迎进群督促!
Widget:Audioplayer
<script> // 存储当前正在播放的音频实例(全局唯一) let currentAudio = null; // 操作锁,防止快速连击造成状态混乱 let isLocked = false;
document.addEventListener('click', function(e) {
const audioPlayer = e.target.closest('.audio-player');
if (!audioPlayer) return;
const audioSrc = audioPlayer.getAttribute('data-src');
if (!audioSrc) {
console.error('播放失败:音频地址不存在');
alert('音频地址无效,无法播放~');
return;
}
// 如果正在处理上一个操作,忽略本次点击 if (isLocked) return; isLocked = true;
// 辅助:解锁
const unlock = () => { isLocked = false; };
// 如果当前有音频实例
if (currentAudio) {
// 同一个音频 → 从头重播
if (currentAudio.src === audioSrc) {
// 先暂停,重置时间,再播放
currentAudio.pause();
currentAudio.currentTime = 0;
currentAudio.play().catch(handlePlayError).finally(unlock);
} else {
// 不同音频 → 停止旧音频,创建新音频
// 先彻底停止旧音频(移除事件等,避免后续干扰)
currentAudio.pause();
currentAudio.src = ; // 释放资源
currentAudio = null;
// 创建新音频
currentAudio = new Audio(audioSrc);
currentAudio.play().catch(handlePlayError).finally(unlock);
}
} else {
// 无正在播放的音频:创建新实例并播放
currentAudio = new Audio(audioSrc);
currentAudio.play().catch(handlePlayError).finally(unlock);
}
function handlePlayError(error) {
// AbortError 是由快速操作(如暂停后立即播放)引起的,属于正常情况,不需提示
if (error.name === 'AbortError') {
console.log('播放被正常中断');
return;
}
console.error('播放失败:', error);
const errorMsg = error.name === 'NotAllowedError'
? '浏览器禁止自动播放,请先与页面交互后再尝试~'
: '音频播放失败,请检查地址是否有效或网络状态';
alert(errorMsg);
currentAudio = null; // 重置当前音频实例
}
}); </script>

沪公网安备 31011002002714 号