需求与bug解决

        做 H5开发的一个需求:页面内有一个按钮点击可以播放语音,产品提供的素材是多段语音,并配有对应文字;

bug1: 切换到后台时,语音还在播放,

解决方法:增加 visibilitychange 监听事件,用 document.hidden 判断是否处于后台。

mounted() {

this.audioTemp = new Audio(AthenaData.audioList[0].voice);

// 切到后台停止语音

document.addEventListener('visibilitychange', () => {

if (document.hidden) {

this.musicDisabled = false; // 按钮状态

this.audioTemp.pause();

}

});

},

bug2: API can only be initiated by a user gesture

原因:部分安卓机要求调用 audio.play() 这个接口必须要用户手势触发,也就是必须是真实的用户操场类似 click之类的事件去触发才行,用js主动去触发dom的click的话也是无效的!

解决方案有二:1. 安卓端上有对应的 api 设置可以取消这个限制,但一定会有合规方面的风险(法务检测那边可能无法通过)2.将多段语音合成一段。

功能实现

template:

// 播放按钮

v-image.normal="musicDisabled ? AthenaData.horn1 : AthenaData.horn2"

class="horn1"

@click="onBgmMusicClick"

/>

// 滚动文字

ref="box"

class="tips-box"

>

ref="content"

class="tips-content"

:style="tranlateDo?{

transition: `all ${tranlateTime}s linear`,

transform: `translateX(-${tranlatex}px)`,

}:{

transform: 'translateX(0)'

}"

>

{{ AthenaData.audioList[voiceIndex].label }}