-2

这几天一直在学习JS。stackoverflow 帮了大忙。但是我想出了一个我什至无法确定或描述的问题(因为我是新手)。

我已经构建了一个基于 < 音频 > 的 mp3 播放器。您需要自己查看/尝试。(对不起)

请在此处检查 JS 代码 - ctrl-f 'STACKoverflow' 在其中 - AntonFrolov.net/music.php

这是您需要执行的操作以查看问题出在哪里(我也将这些操作放到了网站上)。

  1. 点击track #2 - 你会看到一个alert('Track #' +ID); = [曲目#2]
  2. 右下角有一个玩家 - 将轨迹进度设置为 98%,这样它就结束了。
  3. (ID++),你被送到 track#3 。alert('Track #' +ID); = [轨道#3]。好的。
  4. 重复步骤 2。
  5. (ID++),你应该被送到轨道#4。...问题事件:

    • 5a。alert('Track #' +ID); = [轨道#3]。
    • 5b。曲目#3 开始播放。再次。然后您会立即收到下一个 .. 警报
    • 5c。alert('Track #' +ID); = [曲目#4]。
    • 5d。曲目#4 开始播放。这就是我所期望的,但没有事件 5a-5b。

如果您继续执行这些步骤,这将继续。

但是JS代码在这里:

    function FuncPlay(ID,Rnd){
    alert('Track #'+ID);
    if (Rnd==0){
    $('.liActive').removeClass('liActive');
    $('#'+ID).next().addClass('liActive');


    // Set track Data
    $('audio').attr('id','audioNor');
    $('audio').attr('src',$('.liActive').attr('rel'));

    // Play
    var player = $('.tbd').get(0);
    player.play();
    $('#pause').removeClass('hi');
    ID++;
        $(player).bind('ended', function () { 
                if (ID <= <?php echo $am ?>){FuncPlay(ID, 0);}
                else {alert('"...End of the list."' );}
        });
    }
}

我完全不知道如何处理这个问题。感谢您的耐心等待。

4

2 回答 2

2

我认为问题在于您将ended-handler 多次绑定到您的播放器。每次调用 FuncPlay 时,都会附加一次。因此,例如,如果轨道 5 开始,它将首先调用轨道 3 的处理程序,然后是轨道 4,最后是轨道 5。

您可以做的是创建一个名为的全局变量ID,并仅在被调用时绑定到处理程序 document ready。在处理程序函数中,您引用此全局变量。或者,在调用 之前$(player).bind,删除所有与玩家ended事件的绑定。

另外,我建议使用.on(),.bind()仍可用于向后兼容。解除绑定事件处理程序的方法是.off()/ .unbind()

于 2013-11-04T10:50:10.680 回答
0

您不会取消绑定“结束”事件侦听器。Is 在第二首歌曲结尾被调用 2 次,在第三首歌曲结尾被调用 3 次,依此类推。

于 2013-11-04T10:47:04.423 回答