Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.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_Jquery_Html_Audio - Fatal编程技术网

Javascript 调用函数时<;音频>;是在特定的时间

Javascript 调用函数时<;音频>;是在特定的时间,javascript,jquery,html,audio,Javascript,Jquery,Html,Audio,我目前正在做一些有趣的网站,这需要音频提示(我想这就是名字?)。我希望该网站做点什么,当歌曲已经播放了整整X的时间 我可以使用element.currentTime轻松获得当前时间,但我不知道如何说:当element.currentTime==5.2,runFunction()-如果你知道我的意思的话。有什么办法可以做到这一点吗?我当前的测试代码: $(“”)。附加到(“正文”); $(“#audioElement”).attr(“src”http://mp3ornot.com/songs/

我目前正在做一些有趣的网站,这需要音频提示(我想这就是名字?)。我希望该网站做点什么,当歌曲已经播放了整整X的时间

我可以使用
element.currentTime
轻松获得当前时间,但我不知道如何说:当element.currentTime==5.2,runFunction()-如果你知道我的意思的话。有什么办法可以做到这一点吗?我当前的测试代码:


$(“”)。附加到(“正文”);
$(“#audioElement”).attr(“src”http://mp3ornot.com/songs/1B.mp3属性(“自动播放”、“自动播放”);
setInterval(函数(){
//出于某种原因,$(“#audioElement”)。当前时间不起作用,所以我们走的是旧时尚
时间=document.getElementById(“audioElement”).currentTime;
console.log(时间);
}, 1000);
另外,我忘了说这句话,我不能在我想要的时间(以毫秒为单位)执行
setTimeout()
并点击,因为音频加载可能需要一些额外的时间,而实际的代码正好在“看到”时运行,如果你知道我的意思的话。所以没有倒计时。我需要在这里说得准确些。

看到这个了吗

我在JavaScript
setInterval()
函数中添加了以下行:

if (time > 5.2) {
    myFunction();
}
myFunction()
执行一个
console.log
,您将在控制台中看到它

我使用
而不是
=
的原因是,由于处理过程中的波动,报告的时间从不精确。条件中的布尔值可以解决此问题:

triggered = false;
if (time > 5.2 && !triggered) {
    triggered = true;
    myFunction();
}

嗯,我自己做的。。似乎是这样

您可以将
timeupdate
绑定到它,然后解除绑定(显然它会运行代码4次,所以我必须解除绑定)


编辑:不,它的更新速度不够快,无法使它在某一点上完美。它似乎每300毫秒递增一次。

如果需要比
ontimeupdate
提供的分辨率更高的分辨率,可以使用
setInterval

现场演示(仅限声音和警报框!):

$(“”)。附加到(“正文”);
$(“#audioElement”).attr(“src”http://mp3ornot.com/songs/1B.mp3属性(“自动播放”、“自动播放”);
var=false;
var ael=document.getElementById(“audioElement”);
var interval=setInterval(函数(){
控制台日志(ael.currentTime);
如果(!triggered&&ael.currentTime>=5.2){
触发=真;
警报(“达到5.2秒”);
}
如果(ael.结束)清除间隔(间隔);
}, 50);

这将不起作用。请阅读我问题的最后一部分,我只是补充了一下,因为我忘了说那个。加载音频文件可能需要额外的时间这不是倒计时,它会定期轮询,然后在音频播放达到设定的时间长度后响应,如果音频加载需要一段时间,那么在当前时间被报告为5.2秒之前,它会相应地变长-我在这里模拟了这一点:是的,但是如果音频文件加载延迟3秒会发生什么,因为请求延迟?然后Javascript将触发错误:)此答案导致事件多次触发。询问者希望只调用一次。@MaximillianLaumeister实际上我正在处理添加的内容,当时我将更多相关的注释添加到了我优先考虑的答案中-一个
触发的
变量,例如在你的答案中,是这个问题的一个很好的解决方案。它运行代码4次,因为currentTime在
2.2
触发,
2.4
2.6
等。不要将当前时间浮点解析为int,请参阅我的答案以获得更清晰的解决方案。谢谢啊,这是有道理的。我现在就回复你的。另一个需要注意的重要问题是,如果浏览器在第二秒内出现口吃,并且没有注册
timeupdate
事件,则此解决方案将失败。这与我的解决方案很接近。。没有
ontimeupdate
理论上应该与
.bind(“timeupdate”)相同
是吗?我发现我的timeupdate不会立即更新,所以我不能让它在5.25秒的时候启动。它将增加0.888、1.212、1.559等。不是0.001,0.002。你的也一样:(@Snorlax如果你需要更好的分辨率,你可以使用
setInterval
而不是
ontimeupdate
。我用它得到的最佳分辨率大约是50毫秒。我认为没有办法获得完美的毫秒精度。请参阅上面对我答案的编辑。我想我可以使用setInterval,然后在出现错误时停止轮询例如,tTime>5.25。然后使其每隔5-10毫秒进行一次轮询。这不会给客户端PC带来太大的负载。对吗?
setInterval
轮询的分辨率不会低于大约50毫秒-
currentTime
更新速度不会太快,因此您将获得重复的
currentTime
值和计算结果r将只是转动它的轮子。但是,是的,您可以在5.25秒后完全停止轮询,只需将
clearInterval
调用放在第一个
if
语句中,然后删除第二个
if
语句。
triggered = false;
if (time > 5.2 && !triggered) {
    triggered = true;
    myFunction();
}
$("#audioElement").bind("timeupdate", function() {
    var currentTime = parseInt(this.currentTime, 10);
    if(currentTime == 2) { 
        console.log("2 seconds in");
        $(this).unbind("timeupdate");
    }
});