audio, узнать когда возможно проиграть
задача, Нужно узнать когда возможно проиграть аудио
когда .catch все срабатывает когда .then ничего не выводит. в .finally не заходит и console.log('end') не выводит когда в .then делал clearTimeout тоже ничего не выводило, хотя setInterval прерывало <body> </body> <script>let audio= document.createElement('audio') let timerId = setTimeout(async function tick() { console.log('begin') let a=-1 await audio.play() .then((e)=>{ console.log('ok') a=0 }) .catch((error) => { timerId = setTimeout(tick, 2500) console.log(`play failed because the user didn't interact with the document first`) a=1 }) .finally(()=>console.log(a)) console.log('end') }, 2500);</script> |
Всё срабатывает и выводит:
showhtml:5 begin showhtml:14 play failed because the user didn't interact with the document first // catch showhtml:17 1 // finnaly showhtml:18 end А играть не будет никогда - потому, почему написано. Запуск play должен быть результатом клика и никак иначе. Либо хотябы одно аудео\видео хоть раз за время сеанса должно было быть запущено в результате клика. |
Давайте детальнее.
1 состояние, когда пользователь не взаимодействует со страницей, то срабатывает .catch() и я уведомляю пользователя о том что он должен выполнить какое-то действие на странице. И это работает !!!! 2 состояние, когда пользователь уже взаимодействовал со станицей, то дожно срабатывать .then(e), где я хочу уведомлять пользователя "все ок, сигнал будет" и здесь есть проблема, все что я делаю в этом блоке, оно не отображается. Также в данном состоянии в .finally() код не срабатывает. Но стоить заметить, что в этом состоянии можно прервать цикл, если использовать setInterval/clearTimeout |
проблема была в том, что код заходит в .then() после окончания проигрывания. Задали audio.src и все стало на свои места
<body> </body> <script> let audio= document.createElement('audio') audio.src='https://mp3melodii.ru/files_site_02/001/standartnyj_signal_sms_iphone.mp3' let timerId=setInterval(() => { let isPlay=false audio.play() .then(()=>{console.log('проигрывает');clearInterval(timerId)}) .catch(() => console.log('не проигрывает')) }, 2000); </script> |
Часовой пояс GMT +3, время: 03:47. |