Javascript 功能赢得';t递归

Javascript 功能赢得';t递归,javascript,Javascript,我试图制作一个“网络播放器”,当你点击播放按钮时播放音乐,并在一个栏上显示你在曲目中的距离。我制作了一个函数,可以播放音频,并检查您要设置播放条宽度的轨迹距离,但就我而言,我无法让它递归。我知道这个功能是有效的,因为当你点击播放按钮时,播放条会跳到正确的位置,但我似乎无法自动执行。代码如下: function play(x) { var audio = document.getElementById(x); audio.play(); var progress = audio.c

我试图制作一个“网络播放器”,当你点击播放按钮时播放音乐,并在一个栏上显示你在曲目中的距离。我制作了一个函数,可以播放音频,并检查您要设置播放条宽度的轨迹距离,但就我而言,我无法让它递归。我知道这个功能是有效的,因为当你点击播放按钮时,播放条会跳到正确的位置,但我似乎无法自动执行。代码如下:

function play(x) { 
  var audio = document.getElementById(x);
  audio.play(); 
  var progress = audio.currentTime;
  var duration = audio.duration;
  var percent = progress/duration;
  var width = percent*100;
  var progbar = document.getElementById("play-line-elapsed");
  var width = width + "%";
  progbar.style.width = width;
  setTimeout(play("Bring-Out-Yer-Dead"), 5000);
}
const createClock = setInterval(play, 100);

到目前为止,我已经尝试了while循环、do while循环、setTimeout和setInterval。我也是一个javascript的完全初学者,所以当有人向我指出它时,这可能是非常明显的。提前感谢

以下是应该可以使用的代码

function play(x) { 
  var audio = document.getElementById(x);
  audio.play(); 
  var progress = audio.currentTime;
  var duration = audio.duration;
  var percent = progress/duration;
  var width = percent*100;
  var progbar = document.getElementById("play-line-elapsed");
  var width = width + "%";
  progbar.style.width = width;
  setTimeout(function () {play("Bring-Out-Yer-Dead")}, 5000);
}
const createClock = setTimeout(function () {play("Bring-Out-Yer-Dead")}, 100);
您所做的是创建一个间隔,每0.1秒调用
play
,不带任何参数。我想这是行不通的,因为函数需要一个参数

您在
播放
结束时设置的
超时
也不起作用,因为您只是在调用它。您应该提供一个函数对象(不是非常正确的词,但是您得到了它)来设置TIMOUT,而不是调用它。这样做的方式是调用
play
,并将其返回值(未定义的
setTimeout
)赋给
setTimeout
,这使得
setTimeout
什么也不做

更正后的代码会创建一个超时,在0.1秒后调用
play
,然后
play
每5秒继续调用自己

您必须为
setTimeout/setInterval
提供一个0 arity函数,这意味着该函数不接受任何参数。我为此使用了一个匿名函数,但是您可以编写另一个没有参数的函数,并在那里使用它

但我认为你最好使用事件。我没有测试过任何一个,但是这些事件似乎对你正在尝试做的事情很有希望


以下是应该有效的代码

function play(x) { 
  var audio = document.getElementById(x);
  audio.play(); 
  var progress = audio.currentTime;
  var duration = audio.duration;
  var percent = progress/duration;
  var width = percent*100;
  var progbar = document.getElementById("play-line-elapsed");
  var width = width + "%";
  progbar.style.width = width;
  setTimeout(function () {play("Bring-Out-Yer-Dead")}, 5000);
}
const createClock = setTimeout(function () {play("Bring-Out-Yer-Dead")}, 100);
您所做的是创建一个间隔,每0.1秒调用
play
,不带任何参数。我想这是行不通的,因为函数需要一个参数

您在
播放
结束时设置的
超时
也不起作用,因为您只是在调用它。您应该提供一个函数对象(不是非常正确的词,但是您得到了它)来设置TIMOUT,而不是调用它。这样做的方式是调用
play
,并将其返回值(未定义的
setTimeout
)赋给
setTimeout
,这使得
setTimeout
什么也不做

更正后的代码会创建一个超时,在0.1秒后调用
play
,然后
play
每5秒继续调用自己

您必须为
setTimeout/setInterval
提供一个0 arity函数,这意味着该函数不接受任何参数。我为此使用了一个匿名函数,但是您可以编写另一个没有参数的函数,并在那里使用它

但我认为你最好使用事件。我没有测试过任何一个,但是这些事件似乎对你正在尝试做的事情很有希望


设置超时(()=>播放(“拿出你的死亡”),5000)
如果要将undefined传递给setTimeout,请将其包装在函数中以传递该函数。另外,setInterval正在调用play with x=undefined除了正确使用
setTimeout
之外,您当前还将启动播放器(
audio.play()
)与更新进度条混为一谈。这是两个独立的操作。您应该考虑使用播放器的
进度
事件来更新进度条:
设置超时(()=>播放(“拿出死亡”),5000
如果要将undefined传递给setTimeout,请将其包装在函数中以传递该函数。另外,setInterval正在调用play with x=undefined除了正确使用
setTimeout
之外,您当前还将启动播放器(
audio.play()
)与更新进度条混为一谈。这是两个独立的操作。您应该考虑使用播放机的
进度
事件来更新您的进度条:谢谢:)这是有效的。不过,我会看一看事件,这似乎确实是个好消息。不过,我会看一看事件,这似乎很有希望