Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中播放声音?_Javascript_Html - Fatal编程技术网

如何在javascript中播放声音?

如何在javascript中播放声音?,javascript,html,Javascript,Html,我用python创建websocket服务器来处理通知事件。现在,我可以收到通知,问题是我不能播放声音,因为新的自动播放策略已更改,如果我使用javascript播放声音,它会给我带来DomeException。有什么建议吗?据我所知,在html javascript中播放声音很简单。像这个例子: 但这取决于你的浏览器以及你如何加载和播放,因此问题是: 有些浏览器会等到用户单击某个内容,然后让您播放它(找到一种方法) 在某些情况下,浏览器在地址使用SSL之前不允许播放(表示url后面的HTTP

我用python创建websocket服务器来处理通知事件。现在,我可以收到通知,问题是我不能播放声音,因为新的自动播放策略已更改,如果我使用javascript播放声音,它会给我带来DomeException。有什么建议吗?

据我所知,在html javascript中播放声音很简单。像这个例子:

但这取决于你的浏览器以及你如何加载播放,因此问题是:

  • 有些浏览器会等到用户单击某个内容,然后让您播放它(找到一种方法)
  • 在某些情况下,浏览器在地址使用SSL之前不允许播放(表示url后面的HTTPS
  • 加载可能会延迟,因此播放可能会延迟/甚至无法开始
所以我通常这样做:

HTML

<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);
}