Я пытаюсь создать простой аудиоплеер с тегом HTML5. У меня есть 3 элемента <source>
вложенные в основной элемент <audio>
, каждый из которых указывает на звуковую дорожку с несколькими форматами для поддержки кросс-браузера. Я использую простую кнопку для запуска события "click" со следующим кодом:
<audio id="myAudio" preload="none">
<source src="audio/demo.m4a" type="audio/m4a" />
<source src="audio/demo.mp3" type="audio/mp3" />
<source src="audio/demo.ogg" type="audio/ogg" />
<!-- other sources go here -->
</audio>
var audio = document.getElementById("myAudio");
// Change track!
$("#mute").on("click", function(evt) {
$("#myAudio > source:gt(2)").attr({ src: "audio/demo2.ogg" , type: "audio/ogg"});
if(!audio.paused) {
audio.pause();
audio.play();
}
});
Как вы можете догадаться, я пытаюсь изменить атрибут src
третьих элементов, применяя фильтр :gt(2)
. Не только я пытаюсь увеличить трек, но и пытаюсь остановить воспроизведение текущего трека, чтобы новый трек сразу начал воспроизводиться, когда нажимается кнопка. Пока это не влияет на мою веб-страницу.
Если бы я был вами, я бы не стал беспокоиться об изменении оригинального тега, а вместо этого просто использовал второй звук для demo2. Например:
<audio id="demo1" preload="none">
<source src="audio/demo.m4a" type="audio/m4a" />
<source src="audio/demo.mp3" type="audio/mp3" />
<source src="audio/demo.ogg" type="audio/ogg" />
<!-- other sources go here -->
</audio>
<audio id="demo2" preload="none">
<source src="audio/demo2.m4a" type="audio/m4a" />
<source src="audio/demo2.mp3" type="audio/mp3" />
<source src="audio/demo2.ogg" type="audio/ogg" />
<!-- other sources go here -->
</audio>
Если у вас есть много этих звуков, вы можете захотеть генерировать элементы по мере необходимости в javascript.
Этот код должен быть адаптирован для ваших нужд - если у вас будет более двух демонстрационных звуков, вам необходимо адаптировать код для создания соответствующих идентификаторов.
var demo1 = $('#demo1').get();
var demo2 = $('#demo2').get();
//demo2
demo1.play();
// Change track!
$("#mute").on("click", function(evt) {
demo1.pause();
demo2.play();
});
Если вы хотите сделать это так, как вы изначально собирались, то этот код должен сделать трюк, который я думаю:
// Change track!
$("#mute").on("click", function(evt) {
audio.pause();
//not sure if this line will work as intended if you have more than 3 sources...
$(audio).find("source:gt(2)").attr({ src: "audio/demo2.ogg" , type: "audio/ogg"});
audio.load();
audio.play();
});
У меня была игра с кодом, и мне удалось пропустить следующий фрагмент звука. Сначала это не сработало, но как только я изменил фильтр :gt
на 1 вместо 2, он успешно увеличил дорожку. Я попробовал две разные строки кода, чтобы это работало, и оба, похоже, работают, но моя следующая задача (как вы упомянули) состоит в том, чтобы иметь возможность увеличиваться до третьего, четвертого, пятого,..., n-го треков, а затем пропускать назад к предыдущим трекам. Вот мой рабочий код:
// Change track!
$("#next").on("click", function(evt) {
// Change the title of the track
$("#title > p:last").text("Next Track!");
// Pause current track
audio.pause();
// Load the next track and play it
$(audio).find("source:gt(1)").attr({ src: "audio/demo2.ogg" , type: "audio/ogg"});
//$("#myAudio > source:gt(1)").attr({ src: "audio/demo2.ogg" , type: "audio/ogg"});
audio.load();
audio.play();
});
Меня немного смущает разница этих строк кода ниже (вторая строка прокомментирована, поскольку она вообще не воспроизводит звук):
// Get reference to the audio element
var audio = document.getElementById("myAudio");
//var audio = $('#myAudio').get();
Есть ли принципиальная разница между этими строками кода, поскольку я думал, что они будут делать то же самое? Я точно знаю, что вторая строка возвращает массив.
Кроме того, есть ли метод, который я могу вызвать для сброса/обновления текущей звуковой дорожки?
audio.load()
после переключения источников