关于js audio自动播放

audio自动播放

前言

最近公司宣传手册需要加一个背景音乐,需要用到audio标签并且自动播放,开始认为很简单,但是上手才发现浏览器对此做了有些限制。下面让我们一起去看看吧!

正文

Chrome的禁止更加人性化,它有一个MEI的策略,这个策略大概是说只要用户在当前网页主动播放过超过7s的音视频(视频窗口不能小于200 x 140),就允许自动播放。

对于网页开发人员来说,应当如何有效地规避这个风险呢?

Chrome的文档给了一个最佳实践:先把音视频加一个muted的属性就可以自动播放,然后再显示一个声音被关掉的按钮,提示用户点一下打开声音。对于视频来说,确实可以这样处理,而对于音频来说,很多人是监听页面点击事件,只要点一次了就开始播放声音,一般就是播放个背景音乐。但是如果对于有多个声音资源的页面来说如何自动播放多个声音呢?

首先,如果用户还没进行交互就调用播放声音的API,Chrome会这么提示:

DOMException: play() failed because the user didn’t interact with the document first.

解决方法

废话不多说,直接贴代码

	<script>
		// 为了防止第二次创建
		let playState= true
		function testAutoPlay () {
    // 返回一个promise以告诉调用者检测结果
        return new Promise(resolve => {
		if(playState){
			        let audio = document.createElement('audio');
        audio.src = "音频地址"
        //循环播放,如果不需要可注释
		audio.loop="loop"
        document.body.appendChild(audio);
        let autoplay = true;
        // play返回的是一个promise
        audio.play().then(() => {
            // 支持自动播放
            autoplay = true;
			console.log("正常播放")
        }).catch(err => {
            // 不支持自动播放
			console.log("不支持播放")
            autoplay = false;
        }).finally((e) => {
            resolve(autoplay);
        });
		playState=false
		}else{
			resolve(false)
		}

    });
}

let audioInfo = {
    autoplay: false,
    testAutoPlay () {
        return testAutoPlay()
    },
    // 监听页面的点击事件,一旦点过了就能autoplay了
    setAutoPlayWhenClick () {
        function setAutoPlay () {
            // 设置自动播放为true
            audioInfo.autoplay = true;
            document.removeEventListener('click', setAutoPlay);
            document.removeEventListener('touchend', setAutoPlay);
        }
        document.addEventListener('click', setAutoPlay);
        document.addEventListener('touchend', setAutoPlay);
    },
    init () {
        // 检测是否能自动播放
        audioInfo.testAutoPlay().then(autoplay => {
            if (!audioInfo.autoplay) {
                audioInfo.autoplay = autoplay;
            }
        });
        // 用户点击交互之后,设置成能自动播放
        audioInfo.setAutoPlayWhenClick();
    }
};
        // PC端
        document.addEventListener('click', ()=>{
	    audioInfo.init();
        });
        // 移动端
         document.addEventListener('touchend', ()=>{
	      audioInfo.init();
         });
	</script>
  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值