【发布时间】:2020-01-08 06:21:00
【问题描述】:
这是我在此处发布的上一个问题的后续问题。我把它贴在这里以防万一:How do I alter this function so that only one, random song can be played at a time with each click? (JavaScript)
我正在使用 HTML/CSS/JavaScript 构建这个音乐生成器应用程序,主要功能是当用户单击代表音乐流派的特定磁贴时,一首来自该特定流派的歌曲是一次玩。 感谢一些乐于助人的 SO 用户,我能够构建一个函数来帮助我做到这一点:
let previousSong;
const randomizeSongs = playlist => {
if (previousSong) {
previousSong.pause();
previousSong.currentTime = 0;
}
let song = playlist[Math.floor(Math.random() * playlist.length)];
song.play();
previousSong = song;
}
const pop = document.querySelector(".pop") // Div containing audio elements
pop.addEventListener("click", (e) => {
let playlist = document.querySelectorAll(".pop audio")
randomizeSongs(playlist);
})
虽然这段代码运行良好,但我遇到的一个问题是,虽然歌曲是随机播放的,但某些歌曲即使在多次点击后仍会一遍又一遍地播放,而其他歌曲则被忽略。在 Spotify 或 Apple Music 等应用上,当您随机播放歌曲的播放列表时,歌曲会随机播放,但在播放或跳过所有其他歌曲之前不会重复播放。
为了解决这个问题,我写了这段代码:
let previousSong;
const randomizeSongs = playlist => {
if (previousSong) {
previousSong.pause();
previousSong.currentTime = 0;
let filteredPlaylist = playlist.filter(function(previousSong) {
return !previousSong;
})
if (filteredPlaylist.length >= 1) {
randomizeSongs(filteredPlaylist);
}
else {
randomizeSongs(playlist);
}
}
let song = playlist[Math.floor(Math.random() * playlist.length)];
song.play();
previousSong = song;
}
我现在遇到了一个新问题。每当我单击代表音乐流派的特定 div 时,它会随机选择一首歌曲,但在第一次单击之后,控制台会返回:Uncaught TypeError: playlist.filter is not a function at randomizeSongs。
我对自己做错了什么感到困惑,或者我的代码是否朝着正确的方向前进。请帮忙。
【问题讨论】:
-
在运行 randomizeSongs 之前播放列表的形状是什么?运行 randomizeSongs 之后是什么?
-
不要随意选择歌曲。而是随机化你的整个列表,然后按顺序播放它们..
-
请注意,您不需要像您一样将标签放在标题中。标签框用于标签。
-
另外,研究“洗牌数组”。
标签: javascript audio