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>