使用javascript播放音频

使用javascript播放音频,javascript,Javascript,我试图在用户进入我的网站页面一分钟后播放一声嘟嘟声。我在这里找到了解决办法 这是我的密码: $(document).ready(function(){ setTimeout(function () { try{ if(!$(".facebook-chat").hasClass("active")){ $(".facebook-chat").addClass("active"); var

我试图在用户进入我的网站页面一分钟后播放一声嘟嘟声。我在这里找到了解决办法

这是我的密码:

$(document).ready(function(){
    setTimeout(function () {
        try{
            if(!$(".facebook-chat").hasClass("active")){
                $(".facebook-chat").addClass("active");
                var audio = new Audio("/sound/chat.mp3");
                audio.play();
            }
        }catch(e){

        }
    }, 60000);
}):
这会引发一个异常:

未兑现的(允诺中的)例外

奇怪的是,一旦我在浏览器中单独加载声音文件并返回页面,它就可以完美地工作。你知道我该怎么修吗

[编辑] 问题是,在播放声音之前,用户必须与浏览器交互。所以我把同样的代码放在主体的click事件下,它就工作了。但同样的方法也不适用于scroll事件。我猜Chrome没有考虑滚动用户交互。任何人都可以添加什么其他交互可以用来触发这一点吗


另外,如果我在一个单独的窗口中加载音频文件并返回我的页面,它是如何工作的。

当我尝试同样的方法时,我能想到的最佳解决方案是:

const playPromise = audio.play();
if (playPromise !== null){
    playPromise.catch(function() { audio.play(); })
}

但有时(十分之一)第二个audio.play()也未播放,音频也不播放。我建议您创建一个循环,该循环仅在承诺最终被捕获时停止。

您可以尝试在文档准备就绪时加载音频,然后仅在加载资源时播放音频(对于此检查,您可以在
onloadeddata
上注册回调)。否则,若资源未加载,您可以尝试再次加载它

$(文档).ready(函数()
{
设aud=新音频('https://dl.dropboxusercontent.com/s/1cdwpm3gca9mlo0/kick.mp3');
让我们来玩=假;
aud.onloadeddata=()=>(console.log(“音频加载”),canPlay=true);
setInterval(函数()
{
如果(可以玩)
aud.play();
其他的
aud=新音频文件('https://dl.dropboxusercontent.com/s/1cdwpm3gca9mlo0/kick.mp3');
}, 3000);
});

如果删除
设置超时
,是否有效?如果您在
onClick
处理程序中播放它,它是否能持续工作?这是因为您试图在它加载之前播放它吗?@Halcyon我用一个没有超时的滚动事件尝试了它。同样的问题。@JamesT我想是的。。但是我不知道如何修复它。顺便说一句,你的
try…catch
不会捕获
audio.play()
返回的拒绝承诺,除非你将
setTimeout()
回调更改为
异步函数
wait audio.play()
。问题不只是播放声音。当这种情况发生时,我会打开一个聊天窗口。我不确定这里有什么问题。Javascript是异步的,只需弹出聊天窗口并尝试播放声音。其主要功能显然是打开对话框,因此无论歌曲是否在四分之一秒后播放,都是如此。我必须弄清楚它为什么会这样。当我遇到同样的问题时,我也尝试过,但这不是解决办法。