Javascript 随机播放音频曲目,无需递归

Javascript 随机播放音频曲目,无需递归,javascript,jquery,html,html5-audio,Javascript,Jquery,Html,Html5 Audio,我在一个页面上有多个音频元素,这些元素是根据用户使用复选框选择的javascript创建的。当用户单击播放按钮时,我希望播放随机选择的音频曲目,曲目之间的延迟可由用户调整,直到他们单击停止按钮。我有这个密码 function loopmusic(){ if (!looping){ alert('exiting loopmusic()'); return 0; } var audioElements = document.getElementsByTagName('au

我在一个页面上有多个音频元素,这些元素是根据用户使用复选框选择的javascript创建的。当用户单击播放按钮时,我希望播放随机选择的音频曲目,曲目之间的延迟可由用户调整,直到他们单击停止按钮。我有这个密码

function loopmusic(){
  if (!looping){
    alert('exiting loopmusic()');
    return 0;
  }
  var audioElements = document.getElementsByTagName('audio');
  var index = Math.floor(Math.random() * audioElements.length);
  //audioElements[index].volume=0.5;    
  $(audioElements[index]).bind("ended", function(){
    audioElements[index].pause()
    loopmusic()    
  });  
  setTimeout(audioElements[index].play(), delayms);
}
这段代码是根据我在这里读到的内容改编的:

现在,事件侦听器似乎没有按照我预期的方式运行,曲目之间没有延迟,并且多个曲目同时播放。我想要任何关于如何解决这个问题的指针,如果我能在没有递归的情况下做到这一点,那就更好了。这可能会运行一段时间,我希望避免它消耗大量内存

现在,事件侦听器的行为似乎与我的不同 预计,曲目之间没有延迟,多个曲目播放 同时,

您正在调用
.play()
,而不是引用
.play
;尝试在
setTimeout
调用中删除
()
之后的
.play()
。此外,在
结束时调用
.pause()
事件似乎没有必要。不确定在哪里定义了
delayms

setTimeout(audioElements[index].play, delayms);
现在,事件侦听器的行为似乎与我的不同 预计,曲目之间没有延迟,多个曲目播放 同时,

您正在调用
.play()
,而不是引用
.play
;尝试在
setTimeout
调用中删除
()
之后的
.play()
。此外,在
结束时调用
.pause()
事件似乎没有必要。不确定在哪里定义了
delayms

setTimeout(audioElements[index].play, delayms);

为什么在曲目完成后调用
.pause()
delayms
在哪里定义?抱歉,我不想发布大量代码,是的,在调用loopmusic()函数之前定义了循环全局变量和delayms全局变量。我之所以调用.pause(),是因为我在另一篇帖子中看到了它,并认为它会立即停止播放多首曲目,但我不知道此时发生了什么,所以非常感谢您的建议。您在帖子中尝试过
js
?也就是说,在
处删除
()
。在
处删除
()
?哪个会立即调用
.play()
?为什么在曲目完成后调用
.pause()
delayms
在哪里定义?抱歉,我不想发布大量代码,是的,在调用loopmusic()函数之前定义了循环全局变量和delayms全局变量。我之所以调用.pause(),是因为我在另一篇帖子中看到了它,并认为它会立即停止播放多首曲目,但我不知道此时发生了什么,所以非常感谢您的建议。您在帖子中尝试过
js
?也就是说,在
处删除
()
。在
处删除
()
?哪个会立即调用
.play()
?很抱歉,我没有包含更多的代码,delayms是在调用函数loopmusic()之前定义的,它介于1000和6000之间。我尝试了这种方法,但曲目没有播放:setTimeout(audioElements[index].play,delayms);;还有一种方法可以避免递归吗?是的,有一种方法可以在没有递归的情况下执行操作。您可以使用
.queue()
。“我尝试了这种方法,但是音轨没有播放:“你能创建一个JSFIDLE来演示吗?我在这里创建了一个JSFIDLE,但是我没有在线音轨,我会尝试在线查找一秒钟的音轨,以便快速测试。”。试试维基百科或知识共享。随机选择和播放音频可能很简单。我找到了一种保持这种简单的方法,我有一个页面,每个音轨都有一个复选框,单选按钮用于允许重复或不允许重复,还有一个按钮用于在新窗口(w/javascript)中编写带有HTML5声音播放器的页面,这种方法允许我创建一个任意数量元素的随机排列的播放列表。现在我在播放列表中写了1000首歌曲,弹出窗口仍然很快打开!如果有人对这种方法感兴趣,我可以在JSFIDLE上发布代码。抱歉,我没有包含更多代码,delayms是在调用函数loopmusic()之前定义的,它介于1000和6000之间。我尝试了这种方法,但曲目没有播放:setTimeout(audioElements[index].play,delayms);;还有一种方法可以避免递归吗?是的,有一种方法可以在没有递归的情况下执行操作。您可以使用
.queue()
。“我尝试了这种方法,但是音轨没有播放:“你能创建一个JSFIDLE来演示吗?我在这里创建了一个JSFIDLE,但是我没有在线音轨,我会尝试在线查找一秒钟的音轨,以便快速测试。”。试试维基百科或知识共享。随机选择和播放音频可能很简单。我找到了一种保持这种简单的方法,我有一个页面,每个音轨都有一个复选框,单选按钮用于允许重复或不允许重复,还有一个按钮用于在新窗口(w/javascript)中编写带有HTML5声音播放器的页面,这种方法允许我创建一个任意数量元素的随机排列的播放列表。现在我在播放列表中写了1000首歌曲,弹出窗口仍然很快打开!如果有人对这种方法感兴趣,我可以在JSFIDLE上发布代码。