我试图在同一个网页上播放一个音频文件列表,只有一个文本链接作为播放按钮,我找到了以下解决方案,这对我来说非常完美: (感谢@linstantnoodles的脚本!)
<audio id="song1" preload='auto'>
<source src='song1.mp3' type='audio/mp3' />
</audio>
<audio id="song2" preload='auto'>
<source src='song2.mp3' type='audio/mp3' />
</audio>
<a href="javascript:null()" id="song1-control">Listen</a>
<a href="javascript:null()" id="song2-control">Listen</a>
<script type="text/javascript">
// List of audio/control pairs
var playlist = [{
"audio": document.getElementById('song1'),
"control": document.getElementById('song1-control')
}, {
"audio": document.getElementById('song2'),
"control": document.getElementById('song2-control')
}];
for (var i = 0; i < playlist.length; i++) {
var obj = playlist[i];
var audio = obj.audio;
var control = obj.control;
// returns a closure
var listener = function (control, audio) {
return function () {
var pause = control.innerHTML === 'Pause';
control.innerHTML = pause ? 'Listen' : 'Pause';
// Update the Audio
var method = pause ? 'pause' : 'play';
audio[method]();
// Prevent Default Action
return false;
}
};
control.addEventListener("click", listener(control, audio));
}
</script>
我对这段代码的唯一问题是,如果正在播放一首歌曲,而我开始播放第二首歌曲,则两者都在同时播放。我已经尝试了很多方法来解决这个问题,但是没有一个能够正常工作 - 我怎么需要调整它,以便第一个停止或停止第二个启动时?谢谢!
答案 0 :(得分:0)
你可以这样做。当一个新的音频启动时,循环遍历playlist
数组,找到所有不是刚启动的音频元素并停止它们。
以下是一个例子:
....
var method = pause ? 'pause' : 'play';
audio[method]();
if(!pause){
playlist.forEach(function(pl){
if(pl.audio !== audio){
pl.audio.pause();
pl.audio.currentTime = 0;
pl.control.innerHTML = 'Listen';
}
});
}
....