为什么我的JS在第一首歌曲播放完后不播放另一首歌曲?

时间:2020-05-15 18:37:41

标签: javascript html json

在我的网站上,我有一个JavaScript,该JavaScript可以播放某个播放列表中的随机歌曲,该播放列表应该在特定时间播放,播放完毕后,它会选择另一首歌曲。但是,当第一首歌曲结束时,不会选择另一首。

这是JavaScript:

const playlist = [{
    name: 'earlyMorning',
    times: [0, 1, 2, 3, 4, 5, 6],
    songs: ["audio/early_morning/cacoon.mp3", "audio/early_morning/reggae_paradise.mp3", "audio/early_morning/universal_dream.mp3", "audio/exclusive/mellow.mp3", "audio/exclusive/bridge.mp3", "audio/early_morning/1998_trk04.mp3", "audio/early_morning/adagio.mp3", "audio/early_morning/all_obsessed.mp3", "audio/early_morning/no_saints.mp3", "audio/early_morning/swingin_partay.mp3"]
},
{
    name: 'morning',
    times: [6, 7, 8, 9],
    songs: ["audio/morning/universal_dream.mp3", "audio/exclusive/bridge.mp3", "audio/morning/1998_trk04.mp3", "audio/morning/cool_groovings.mp3", "audio/morning/game_on.mp3", "audio/morning/half_pipe.mp3", "audio/morning/hope.mp3", "audio/morning/internationale!.mp3", "audio/morning/move_it.mp3", "audio/morning/muted.mp3", "audio/morning/no_saints.mp3", "audio/morning/swingin_partay.mp3"]
},
{
    name: 'primetime',
    times: [19, 20, 21],
    songs: ["audio/exclusive/sky_prologue.mp3", "audio/exclusive/rise_up.mp3", "audio/exclusive/lo-fi_night.mp3", "audio/exclusive/primetime.mp3", "audio/exclusive/the_final_showdown.mp3", "audio/exclusive/cine2020(edit).mp3", "audio/primetime/1998_trk04.mp3", "audio/primetime/apocalypse(remix).mp3", "audio/primetime/bondicular(remix).mp3", "audio/primetime/choir_of_impending_breakbeat.mp3", "audio/primetime/cine2000.mp3", "audio/primetime/kompressor(remix).mp3", "audio/primetime/no_saints.mp3", "audio/primetime/orchestral_hardcore(remix).mp3", "audio/primetime/orchestral_hardcore.mp3", "audio/primetime/quest.mp3", "audio/primetime/swingin_partay.mp3", "audio/primetime/the_trap.mp3"]
},
{
    name: 'daytime',
    times: [11, 12, 13, 14, 15, 16, 17, 18],
    songs: ["audio/daytime/summer_vibe.mp3", "audio/daytime/universal_dream.mp3", "audio/exclusive/ocean.mp3", "audio/daytime/1998_trk04.mp3", "audio/exclusive/boombox.mp3", "audio/daytime/2009_trk7.mp3", "audio/daytime/4.mp3", "audio/daytime/connected.mp3", "audio/daytime/funkerama.mp3", "audio/daytime/gritty_groove.mp3", "audio/daytime/internationale!(remix).mp3", "audio/daytime/no_saints.mp3", "audio/daytime/smooth_strings_trip.mp3", "audio/daytime/sunset.mp3", "audio/daytime/swingin_partay.mp3"]
},
{
    name: 'nightclub',
    times: [22, 23],
    songs: ["audio/exclusive/lo-fi_night.mp3", "audio/exclusive/bridge.mp3", "audio/exclusive/the_final_showdown.mp3", "audio/exclusive/prologue.mp3", "audio/exclusive/eclectic_attraction.mp3", "audio/nightclub/adagio.mp3", "audio/nightclub/apocalypse.mp3", "audio/nightclub/dance_9.mp3", "audio/nightclub/internationale!.mp3", "audio/nightclub/nu-soul_village(remix).mp3", "audio/nightclub/obsessive.mp3", "audio/nightclub/universe.mp3"]
}
]

let nowPlaying = null;
const player = document.getElementById("player"); // Get Audio Element
player.autoplay = true;

player.addEventListener("ended", function () {
    player.currentTime = 0;
    console.log(`${selection} ended`);
    player.addEventListener("ended", selectRandom); // Run function when song ends
});

function selectRandom() {
    // destructure object because all we want is the song array
    const { songs } = playlist.find(list => list.times.includes(new Date().getHours()));
    // remove the currently playing song, or nothing if null
    const filteredSongs = songs.filter(song => song != nowPlaying);
    // pick a random song out of the remaining songs
    const selection = filteredSongs[Math.floor(Math.random() * filteredSongs.length)]
    lastSong = selection; // Remember last song
    player.src = selection; // Tell HTML the location of the new Song
    console.log(`Now playing ${selection}`);
}

selectRandom(); // Select initial song
player.play; // Start song

这是在HTML中初始化的方式:

<iframe allow="autoplay" style="display:none" id="player" type="audio/mpeg">

1 个答案:

答案 0 :(得分:0)

这是因为您仅将另一个事件侦听器设置为player而不是调用selectRandom函数。删除ended事件中的事件侦听器,然后调用selectRandom();

player.addEventListener("ended", function () {
  player.currentTime = 0;
  console.log(`${selection} ended`);
  selectRandom();
});

请使用<audio>标签,而不是使用用于嵌入内容的<iframe>,如下例所示:

<audio style="display:none" id="player" src=""></audio>

在脚本的结尾,您忘记了实际上调用play()的{​​{1}}方法,而实际上却没有调用<iframe>的方法。

<audio>

请注意,由于现代浏览器禁用了此功能,因此音频不会自动播放。相反,您需要用户输入才能开始播放。

player.play();
<button id="play-song">Play song</button>
相关问题