少し遊んだ後、私はこれで終わりました:
HTML:
<audio class="fo_audio" controls="controls">
<source src="http://cache.gizmodo.com/assets/resources/mp3/Woman64.mp3" type="audio/mpeg" />
<source src="http://cache.gizmodo.com/assets/resources/mp3/WomanWAV.wav" type="audio/wav" />
</audio>
<audio class="fo_audio" controls="controls">
<source src="http://cache.gizmodo.com/assets/resources/mp3/FeelGood64.mp3" type="audio/mpeg" />
<source src="http://cache.gizmodo.com/assets/resources/mp3/FeelGoodWAV.wav" type="audio/wav" />
</audio>
<audio class="fo_audio" controls="controls">
<source src="http://cache.gizmodo.com/assets/resources/mp3/Carmen64.mp3" type="audio/mpeg" />
<source src="http://cache.gizmodo.com/assets/resources/mp3/CarmenWAV.wav" type="audio/wav" />
</audio>
<div>
<button class="play" data-which="0">Play 0</button>
<button class="play" data-which="1">Play 1</button>
<button class="play" data-which="2">Play 2</button>
<button class="play" data-which="all">Play all</button>
</div>
Javascript:
var playing = false;
function playCascade(e) {
if(playing) { return; }
var song_number = e.song_number || 0;
var $a = $("audio").eq(song_number);
if($a.length) {
$a.get(0).play();
$a.off('ended').on('ended', function(){
playing = false;
if(e.continu) {
playCascade($.extend(e, {
'song_number': song_number + 1
}));
}
});
playing = true;
}
else {
playing = false;
}
}
$(".play").on('click', function(e) {
var which = $(this).data('which');
playCascade($.extend(e, {
'song_number': Number($(this).data('which')) || 0,
'continu': which == 'all'
}));
});
デモ
ノート:
- 再生シーケンスは再帰で実現されます。
- イベントオブジェクト
e
は、カスタムデータを渡すように拡張されています。
- 新しい「終了」ハンドラーは、再生ごとにオーディオオブジェクトにアタッチされます。
- 'continue'はjavascriptの予約語であるため、避けるのが最善です。したがって、「継続」。
- デモには、各クリップの最後の5秒間だけが再生される追加の行があります。
- オーディオ要素を非表示にするに
controls="controls"
は、<audio>
タグから削除します。
- Opera12.02でテスト済み。
そして、ここにコードの変形があります:http: //jsfiddle.net/bbPCk/3/