使用audio标签时,当前页面没有进行交互时,比如用户刷新了页面后,play()调用就会报错,如下图:
查找资料后,发现是2018年4月以后,chrome浏览器对这块进行了优化,为了节约流量,禁止了自动播放,必须由用户交互后才能触发。
当用户点击网页后,点击任何位置都行,andio就能自动播报了,然后我就想了个方案,设置个按钮,让按钮自动点击,然后触发audio,然而发现这种作弊方案,仍旧不行 后来各种找方法,标签加muted属性仍于事无补,到最后也只有没有办法的办法。
由于play()方法是一个promise,监听它的成功和失败状态,如果失败,那就提醒用户进行交互,设置一个激活按钮,点击后就能触发了。
1 <template>
2 <el-button class="autoPlay" type="text" v-if="isShow" @click="autoPlay">激活</el-button>
3 <!-- audio宽度设0,让其隐藏 -->
4 <audio muted controls ref="audio" :src="audioSrc" style="width: 0px;"></audio>
5 </template>
6 import newOrder from '@/assets/audio/new_order.mp3'
7
8 export default {
9 data () {
10 return {
11 audioSrc: newOrder,
12 isShow: false
13 }
14 },
15 created() {
16 this.open()
17 },
18 methods: {
19 open() {
20 const myAudio = document.getElementsByTagName('audio')[0]
21 if (myAudio.canPlayType) {
22 this.autoPlay()
23 } else {
24 this.$message({
25 type: 'error',
26 message: '您的浏览器不支持语音播报'
27 })
28 }
29 },
30 // 自动播放
31 autoPlay() {
32 this.$refs.audio.play().then(() => {
33 this.isShow = false
34 }).catch(() => {
35 this.$message({
36 type: 'error',
37 message: '语音播报失效,点击右上角"激活"按钮'
38 })
39 this.isShow = true
40 })
41 }
42 }
43 }