如何在javascript中播放声音?
我用python创建websocket服务器来处理通知事件。现在,我可以收到通知,问题是我不能播放声音,因为新的自动播放策略已更改,如果我使用javascript播放声音,它会给我带来DomeException。有什么建议吗?据我所知,在html javascript中播放声音很简单。像这个例子: 但这取决于你的浏览器以及你如何加载和播放,因此问题是:如何在javascript中播放声音?,javascript,html,Javascript,Html,我用python创建websocket服务器来处理通知事件。现在,我可以收到通知,问题是我不能播放声音,因为新的自动播放策略已更改,如果我使用javascript播放声音,它会给我带来DomeException。有什么建议吗?据我所知,在html javascript中播放声音很简单。像这个例子: 但这取决于你的浏览器以及你如何加载和播放,因此问题是: 有些浏览器会等到用户单击某个内容,然后让您播放它(找到一种方法) 在某些情况下,浏览器在地址使用SSL之前不允许播放(表示url后面的HTTP
- 有些浏览器会等到用户单击某个内容,然后让您播放它(找到一种方法)
- 在某些情况下,浏览器在地址使用SSL之前不允许播放(表示url后面的HTTPS)
- 加载可能会延迟,因此播放可能会延迟/甚至无法开始
<audio id="notifysound" src="notify.mp3" autobuffer preload="auto" style="visibility:hidden;width:0px;height:0px;z-index:-1;"></audio>
如果我想确保在通知时播放,最安全的方法是:
JAVASCRIPT(在您的情况下)
(只希望它能被播放。因为即使是可能的音量或某些定制也会使它失败。)要绕过新的自动播放策略: 创建一个可以播放声音、隐藏声音并触发声音的按钮:
var event = new Event('click');
playBtn.dispatchEvent(event);
编辑
假设你有:
let audioData='数据:音频/wav;base64,。。ᴅᴀᴛᴀ...'; // 或src路径
您可以随时使用此函数触发,而无需向DOM追加或创建元素:
function playSound() {
let audioEl = document.createElement('audio');
audioEl.src = audioData;
let audioBtn = document.createElement('button');
audioBtn.addEventListener('click', () => audioEl.play(), false);
let event = new Event('click');
audioBtn.dispatchEvent(event);
}
用法:
只需playSound()
编辑2
我重新测试了我的代码,它不起作用了。。。奇怪的建议-不要与自动播放的趋势作斗争。这项政策有很好的理由。询问用户是否需要声音,一切都会很好。每场比赛都是这样。它不会立即开始大喊大叫。你能添加一些代码吗?例如,可能相关的@gnat Firefox现在已经默认为无自动播放,除非用户管理设置。是的,它可以工作,但是为什么如果我刷新页面,声音就不会播放。这给了我意想不到的惊喜。如果我注销并再次登录,它将再次工作。感谢您的回复。请分享您的代码,并给出详细解释,检查您的代码当浏览器打开时,此代码将正常工作,您的问题中没有任何服务人员。所以我认为你应该把你的问题改为如何通过服务人员通知播放声音。答案是android中有一个选项()。如果你只从服务人员那里谈论浏览器,也会有一些相同的问题,比如:我已经测试过了,它可以工作,但是为什么如果我刷新页面,声音就不会播放呢。这给了我意想不到的惊喜。如果我注销并再次登录,它将再次工作。谢谢你的建议
var event = new Event('click');
playBtn.dispatchEvent(event);
function playSound() {
let audioEl = document.createElement('audio');
audioEl.src = audioData;
let audioBtn = document.createElement('button');
audioBtn.addEventListener('click', () => audioEl.play(), false);
let event = new Event('click');
audioBtn.dispatchEvent(event);
}