我已经学习了几天JS。 stackoverflow是一个很大的帮助。然而,我想出了一个我甚至无法确定或描述的问题(因为我是新手)。
我建了一个<基于音频>的mp3播放器。 您需要自己查看/尝试。 (对不起)
Please check JS code here - ctrl-f 'STACKoverflow' in it - AntonFrolov.net/music.php
以下是您需要执行的操作,以查看问题所在(我已将这些内容放到网站上)。
(ID ++),您应该被发送到#4轨道。 ......问题事件:
如果您继续执行此步骤,这将继续。
然而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."' );}
});
}
}
我完全不知道如何处理这个问题。感谢您的耐心等待。
答案 0 :(得分:2)
我认为问题在于您将ended
- 处理程序多次绑定到您的播放器。每次调用FuncPlay时,它都会被另一次附加。
因此,例如,如果然后轨道5开始,它将首先调用轨道3的处理程序,然后轨道4,最后轨道5。
您可以做的是创建一个名为ID
的全局变量,并仅在调用document ready
时绑定到处理程序。在handler-function中,您可以引用此全局变量。
或者,在调用$(player).bind
之前,删除对玩家ended
事件的所有绑定。
另外,我建议使用.on()
,.bind()
仍可用于向后兼容。取消绑定事件处理程序的方法是.off()
/ .unbind()
。
答案 1 :(得分:0)
你没有取消绑定你'结束'的事件监听器。是第二首歌叫2次,第3次叫3次等等。