示例 1
这是一个示例,它创建了一个 div 并使用 HTML5 <audio> 标记并回退到 <embed>,在单击按钮 3 秒后播放音频文件。
要对其进行测试,请运行示例并单击按钮,然后更改选项卡并计数 3 秒。您应该会在此选项卡上看到扬声器图标,并在 3 秒后听到硬币掉落的声音,即使此选项卡不是当前选项卡。
function playCoinDrop() {
soundDiv = document.createElement("div");
soundDiv.innerHTML = '<audio autoplay="autoplay"><source src="http://themushroomkingdom.net/sounds/wav/smw/smw_coin.wav" type="audio/wav" /><embed hidden="true" autostart="true" loop="false" src="http://themushroomkingdom.net/sounds/wav/smw/smw_coin.wav" /></audio>';
}
<button onclick="setTimeout(playCoinDrop, 3000)">play sound</button>
您可以根据需要替换音频文件。
示例 2 - 本地存储
这是一种更高级的方法,它利用了localStorage,这可能是您的最佳选择。这允许您通过将通知声音作为 Base64 下载到 localStorage 来预加载通知声音,然后您可以在选项卡在后台时调用播放它,而不会导致额外的网络传输。
这种方法的一个主要好处是只下载一次通知文件,然后从浏览器 localStorage 本地播放。
downloadCoin() 函数将文件作为 base64 存储在 localStoarge 中
playCoinDrop() 动态创建 div 并播放 base64 数据
playCoinDropJS() 播放 base64 数据而不创建任何 div
function downloadCoin() {
var coin = 'smw_coin.wav';
var xhr = new XMLHttpRequest();
xhr.open('GET', coin, true);
xhr.responseType = 'blob';
xhr.onload = function(e) {
if (this.status == 200) {
var blob = new Blob([this.response], {
type: 'audio/wav'
});
var reader = new window.FileReader();
reader.readAsDataURL(blob);
reader.onloadend = function() {
var coinB64 = reader.result;
var myStorage = localStorage.setItem('coin_base64', coinB64)
}
}
};
xhr.send();
}
function playCoinDrop() {
var coinB64 = localStorage.getItem('coin_base64');
var soundDiv = document.createElement('div');
soundDiv.innerHTML = '<audio autoplay="autoplay"><source src="' + coinB64 + '" type="audio/wav" />';
}
function playCoinDropJS(){
var coinB64 = localStorage.getItem("coin_base64");
var snd = new Audio(coinB64);
snd.play();
}
<button onclick="downloadCoin()">download</button>
<button onclick="setTimeout(playCoinDrop, 3000)">play sound</button>
<button onclick="setTimeout(playCoinDropJS, 3000)">play sound JS</button>
demo on github