前端提示音在Vue里怎么播放才不被浏览器拦截?
我在做消息通知功能,想收到新消息时自动播放提示音,但总是被浏览器静音了,试了好几种方法都不行。
我用的是 Vue 3,代码大概是这样:
<template>
<button @click="playSound">测试播放</button>
</template>
<script setup>
const playSound = () => {
const audio = new Audio('/notice.mp3');
audio.play();
};
</script>
点击按钮能播,但如果是异步收到 WebSocket 消息后自动调用 playSound(),就完全没声音,控制台还报错说“play() failed because the user didn’t interact with the document”。这该怎么解决啊?
记得 silent.mp3 这个文件得是真的无声,否则可能也会被拦截。
解决这个问题的一个常见方法是先让用户交互一下页面,比如点击一个按钮,然后在那个交互事件里初始化音频上下文。之后再通过 WebSocket 消息播放声音就不会被阻止了。
你可以试试下面这个方法:
这个例子加了一个初始化音频的按钮。用户点了之后会尝试播放一次音频,成功后设置一个标志表示音频上下文已经初始化。之后无论是手动点击播放还是通过 WebSocket 消息触发,都能正常播放了。
记得在实际项目中,用户体验要考虑到,不能频繁要求用户去点击初始化按钮。有时候可能需要结合具体的业务场景来设计更好的解决方案。希望这个能帮到你。