我知道之前已经问过这个问题,但我是JavaScript的新手,在阅读了其他答案后,我无法理解为什么我的方法不起作用。播放的第一首曲目是随机的,但是当歌曲结束时,相同的曲目一遍又一遍地重复,而不是选择不同的随机曲目。如果audio.play第一次选择随机曲目,为什么它不会在歌曲结束时再次选择随机曲目,而是循环相同的曲目?帮助赞赏:
var audio_files = [
"TRACKS/1.mp3",
"TRACKS/2.mp3",
"TRACKS/3.mp3"
]
var random_file = audio_files[Math.floor(Math.random() * audio_files.length)];
var audio = new Audio(random_file);
audio.play();
audio.addEventListener('ended', function(){
audio.play();
}
答案 0 :(得分:0)
您的代码必须如下:
var audio_files = [
"TRACKS/1.mp3",
"TRACKS/2.mp3",
"TRACKS/3.mp3"
]
function random_file(){
return audio_files[Math.floor(Math.random() * audio_files.length)];
}
var audio = new Audio( random_file() );
audio.play();
audio.addEventListener('ended', function(){
audio.play( random_file() );
}
如果玩家有另一种方式为现有付款人指定文件
,那么您的列表工具可能是这样的audio.addEventListener('ended', function(){
audio.src = random_file();
audio.play();
}
或者如果您的播放器没有这种api方法,唯一的方法是
function listner() {
audio = new Audio( random_file() );
audio.play();
audio.addEventListener('ended', listner)
}
audio.addEventListener('ended', listner)
答案 1 :(得分:0)
使用Node.js在客户端或服务器端安装着名的underscoreJS模块并调用示例函数;
var random_file = _.sample(audio_files);
答案 2 :(得分:0)
将数组洗牌并简单地迭代以获取每个文件会更容易。使用此解决方案,由于随机解决方案,您将无法获得相同的文件两次。
一旦你到达终点,做同样的事情,洗牌并再次迭代。像这样,列表会改变,给人以随机方式选择不同文件的印象(但真正简单地迭代)。
这是一个伪代码
function readFiles(){
array = shuffle(array);
for(var i = 0; i < array.length; ++i){
play(array[i]);
}
readFiles(); //to read undefinitly
}
Here和here,你会找到一个很好的线程来改组数组。我不会再这样做,只要按照那里的答案。
在你的情况下,你不想要一个循环但你会使用一个计数器来获取下一个文件并在你到达结束时再次洗牌
function getNextFile(){
if(currentFile >= array.length){ //reach the end
shuffle(array);
currentFile = 0;
}
return array[currentFile+];
}