点击按钮播放音效时为什么有时没声音?
我在做一个小游戏,想在用户点击按钮时播放一个“叮”的音效。但有时候点了很多下都没声音,刷新页面后又好了。我试过用 new Audio() 创建音频对象,也试过提前加载,但问题还是偶尔出现。
是不是浏览器对自动播放有啥限制?但我明明是在用户点击事件里触发的啊。下面是我现在的代码:
const clickSound = new Audio('/sounds/click.mp3');
document.getElementById('action-btn').addEventListener('click', () => {
clickSound.currentTime = 0;
clickSound.play().catch(e => {
console.log('播放失败:', e);
});
});
控制台偶尔会报错说 play() 被拒绝,但点击确实是用户主动触发的,这到底怎么回事?
currentTime设为 0 再调用play(),浏览器有时候会懵掉,尤其是快速连续点击的时候。最简单的解决方案就是每次点击都 new 一个新的 Audio 实例,别复用:
复制这个就能解决大部分场景。但如果你担心频繁创建对象有性能问题,或者音频文件比较大,可以用「音频池」的方式,预先创建几个实例轮着用:
还有个细节要注意,你的音频文件最好在页面加载时预先加载一下,给 Audio 标签加上
preload="auto"或者手动触发一次 load,不然第一次点击可能会有延迟。对了,如果你要兼容移动端,记得确认用户有过一次交互动作后再播放,iOS 对这个限制比较严。不过你说是按钮点击触发,应该没问题。
搞定:每次点击都新建 Audio 实例,并确保资源已加载(或加个 preload):