Chrome已不再支持打开浏览器自动播放声音,为了遏制一些广告对用户的影响,浏览器升级70.0后版本对音频自动播放限制,不能用代码触发音频播放事件必须由用户手动触发,主要目的是让用户自己触发,才可以播放。
这样的做法初衷可能有以下几点:
-
禁广告,不能自动播放了一定程度上起到了禁用广告的效果
-
为用户节省流量,因为视频音频加载时需要缓冲的会耗费用户流量,但是用户不一定会看这个视频或音频第一次打开不支持自动播放,就给了用户选择的空间,也给用户节省了流量
很多开发者有非常大致质疑声音,认为这样做不合理,谷歌在以前的版本改过一次,又放开了, 并在后面70版本中要做这样的一次更新,并为开发者留了时间去更改他们的代码。
查到的解决方案中很多文章中说的设置方案,其实已经没有用了。
看他的官方文档的解释,我想只要让用户触发了某个事件,就能绕过谷歌的这个限制,使播放音频的动作在变成合理的,就是用自定义事件触发来播放。
如果直接调用play()播放音频,会出现下面的报错:Uncaught (in promise) DOMException: play() failed because the user didn't interact with the document first.
解决思路时候
把播放paly()调用放在事件回调中,再用定时器触发这个事件,便可以实现“自动”播放,此时调用play()方法不会出现报错。
自定义事件实现的大概代码是:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body id = "app">
<div>bofang</div>
<audio id="audio" src="http://downsc.chinaz.net/Files/DownLoad/sound1/202002/12505.wav" style="opacity:0" preload="auto" controls hidden="true"/>
<script>
var myAuto = document.getElementById('audio');
var app = document.getElementById("app");
// 监听事件
app.addEventListener("mousemove", function(){
console.log("played");
myAuto.play();
}, true);
// 用定时器触发事件
setInterval(function(){
if ("createEvent" in document) {
var evt = document.createEvent("HTMLEvents");
evt.initEvent("mousemove", false, true);
app.dispatchEvent(evt);
}
else
app.fireEvent("onmousemove");
}, 1000);
</script>
</body>
</html>