如何使此javascript播放列表跳过丢失的曲目?

如何使此javascript播放列表跳过丢失的曲目?,javascript,jquery,html,html5-audio,playlist,Javascript,Jquery,Html,Html5 Audio,Playlist,让我从头开始。以下是将html识别为播放列表的脚本: var audio; var library; var tracks; var current; init(); function init() { current = 0; audio = $('.player'); library = $('.album_tracks_container'); tracks = library.find('.span-link'); len = tracks.len

让我从头开始。以下是将html识别为播放列表的脚本:

var audio;
var library;
var tracks;
var current;
init();
function init() {
    current = 0;
    audio = $('.player');
    library = $('.album_tracks_container');
    tracks = library.find('.span-link');
    len = tracks.length;
    var playlist;
    library.find('.span-link').click(function(e) {
        e.preventDefault();
        link = $(this);
        current = link.parent().index();
        playlist = link.closest('.album_tracks_container');
        run(link, audio[0]);
    });
    audio[0].addEventListener('ended',function(e) {
        current++;
        if(current == len){
            current = 0;
            link = playlist.find('.span-link')[0];
        } else {
            link = playlist.find('.span-link')[current];   
        }
        run($(link),audio[0]);
    });
}
function run(link, player) {
    player.src = link.attr('data');
    audio[0].load();
    audio[0].play();
}
它适用于下面这样的html,播放完当前曲目后,它将播放列表中的下一首曲目:

<div class="album_container">
    <div class="album_tracks_container">
        <div class="album_tracks_light">
            <span class="span-link" data="media/album1/01.wav"></span>
        </div>
        <div class="album_tracks_dark">
            <span class="span-link" data="media/album1/02.wav"></span>
        </div>
        <div class="album_tracks_light">
            <span class="span-link" data="media/album1/03.wav"></span>
        </div>
        <div class="album_tracks_dark">
            <span class="span-link" data="media/album1/04.wav"></span>
        </div>
    </div>
</div>

如果我有这样一个html,它似乎也可以正常工作,它将跳过第三个容器并开始播放第四个:

<div class="album_container">
    <div class="album_tracks_container">
        <div class="album_tracks_light">
            <span class="span-link" data="media/album2/01.wav"></span>
        </div>
        <div class="album_tracks_dark">
            <span class="span-link" data="media/album2/02.wav"></span>
        </div>
        <div class="album_tracks_light">
            <span class="span-not-link"></span>
        </div>
        <div class="album_tracks_dark">
            <span class="span-link" data="media/album2/04.wav"></span>
        </div>
    </div>
</div>

但是假设我有一个像下面这样的html,它似乎不起作用。播放曲目02后,不会切换到曲目03:

<div class="album_container">
    <div class="album_tracks_container">
        <div class="album_tracks_light">
            <span class="span-not-link"></span>
        </div>
        <div class="album_tracks_dark">
            <span class="span-link" data="media/album2/02.wav"></span>
        </div>
        <div class="album_tracks_light">
            <span class="span-link" data="media/album2/03.wav"></span>
        </div>
        <div class="album_tracks_dark">
            <span class="span-link" data="media/album2/04.wav"></span>
        </div>
    </div>
</div>

有什么想法吗

-编辑-


我仍然很难弄清楚这一点,但在上一次编辑中,我发现这与丢失的曲目关系不大,而更多的是与第一首曲目是否存在有关。如果有01.wav,播放列表工作,但如果没有,播放列表将中断。

您可以检查它是否有文件链接:

 playlist.find('.span-link').click(function(e) {
    if($(this).attr("data").length>0){
            e.preventDefault();
            link = $(this);
            current = link.parent().index();
            currentplaylist = link.closest('.album_tracks_container');
            run(link, audio[0]);
       } });

我认为问题出在你这一方

我们应该检查这里的数据链接,如果它不存在,就转到下一个

也许是这样的:

audio[0].addEventListener('ended',function(e) {
    current++;
    while(current < len){
        link = playlist.find('.span-link')[current];
        if(!link.attr("data").length) current++;
    }

    if(current == len) {
        current = 0;
        link = playlist.find('.span-link')[0];
    }

    run($(link),audio[0]);
});
音频[0]。addEventListener('ended',函数(e){
电流++;
while(电流
另一件事是,如果你的播放列表没有改变,最好是缓存 playlist.find('.span link'),然后每次都使用它


玩得开心。:)

在我看来,是的,它不应该选择没有class
span-link
的元素。那么你能描述一下你的问题吗?您使用的代码是否准确?您应该将变量
link
设置为local,而不是globalIt。确切的代码是。发生的情况是,播放结束后,它不会加载04.wav,只是在播放02.wav后停止。它可能与current=link.parent().index()有关吗;也许吧?嗯,我试过了,但它似乎对原始代码没有任何影响。它只是向下移动到03轨并在那里停止(因为没有文件可播放)。它不想启动轨道04。我尝试将“span not link”替换为常规的“span link”,与其他类似,只是没有数据属性。但这使得它不再想在完整的播放列表中播放下一首歌。我也有了另一个发现,现在在OP里。