Повторное использование аудио-объекта HTML5 в Mobile Safari
Я хочу воспроизвести короткий (менее 1 с) аудиофайл в ответ на ввод пользователя в моем веб-приложении, работающем в Mobile Safari на iPad, с минимальной задержкой между воспроизведением событий и аудио. Воспроизведение может запускаться несколько раз между перезагрузкой страницы, поэтому я хочу кэшировать аудиофайл.
Ниже воспроизводится файл при первом щелчке, но после чего ничего не происходит:
var audio = new Audio("ack.mp3");
$("#button").click(function(e) {
e.preventDefault();
audio.play();
}
Если я добавлю прослушиватель событий к событию "законченный", который перезагружает файл, я могу получить два воспроизведения от одного и того же объекта, а затем отключить:
var audio = new Audio("ack.mp3");
audio.addEventListener('ended', function() {
audio.load();
}, false);
$("#button").click(function(e) {
e.preventDefault();
audio.play();
}
Если я вручную установил атрибут currentTime равным 0:
var audio = new Audio("ack.mp3");
audio.addEventListener('ended', function() {
audio.currentTime=0;
}, false);
$("#button").click(function(e) {
e.preventDefault();
audio.play();
}
В консоли ошибок появляется следующая ошибка:
INDEX_SIZE_ERR: DOM Exception 1: Index or size was negative, or greater than the allowed value.
Любые идеи о том, как сделать эту работу? Спасибо заранее
Ответы
Ответ 1
установите currentTime
в 0.1
вместо нуля, не используйте load()
, иначе он сломает событие ended
.
если вам нужно предварительно загрузить файл мультимедиа:
media.play(); //start loading
if(media.readyState !== 4){ //HAVE_ENOUGH_DATA
media.addEventListener('canplaythrough', onCanPlay, false);
media.addEventListener('load', onCanPlay, false); //add load event as well to avoid errors, sometimes 'canplaythrough' won't dispatch.
setTimeout(function(){
media.pause(); //block play so it buffers before playing
}, 1); //it needs to be after a delay, otherwise it will block download and/or won't pause.
}else{
onCanPlay();
}
Ответ 2
У меня была точно такая же проблема.
это грязный трюк, но сброс src на звуковой объект работал у меня:
audio.src = audio.src;
audio.play();