這只是Chrome中的一個問題,在其他瀏覽器中運行正常。Google Chrome,audio,setTimeout,替換音頻src,重新開始mid-audio
我點擊播放歡迎消息的揚聲器,如果歡迎消息沒有完成,我會繼續檢查,直到完成,然後將源更改爲另一條消息。
如果我然後再次單擊揚聲器聽到新的消息,這個消息開始,幾秒鐘後停止和重新啓動,然後停止(我的估計是,當該消息的持續時間被傳遞停止)
在我的html:
<audio id="shop_audio" preload="auto" type="audio/mpeg" src="/audios/helper/shop/en/welcome.mp3"></audio>
<p id="shop_speaker">
<i class="fa fa-volume-up"></i>
</p>
在我的javascript:
文件準備:
$("#shop_speaker").click(function(){
document.getElementById("shop_audio").play();
});
然後:
$(window).load(function(){
sl.utils.t_shopInstructions = setTimeout(sl.shop.audio.setAudio, 5000, 0);
});
和:
sl.shop.audio={
setAudio: function(which){
clearTimeout(sl.utils.t_shopInstructions);
var audio = document.getElementById("shop_audio");
if(audio.paused==true){
sl.shop.audio.newSrc(which);
}else{
sl.utils.t_shopAudioPlaying = setInterval(sl.shop.audio.waitForPaused, 500, which);
}
},
waitForPaused: function(which){
if(document.getElementById("shop_audio").paused==true){
clearInterval(sl.utils.t_shopAudioPlaying);
sl.shop.audio.newSrc(which);
}
},
newSrc: function(which){
document.getElementById("shop_audio").src = '/audios/helper/shop/en/help_instruction_'+which+'.mp3';
}
}
而一個變種,也適用無處不在,除了鉻: (我認爲的setInterval是造成麻煩,和/或其清算)
sl.shop.audio={
setAudio: function(which){
clearTimeout(sl.utils.t_shopInstructions);
var audio = document.getElementById("shop_audio");
if(audio.paused==true){
sl.shop.audio.newSrc(which);
}else{
(function looping(){
clearTimeout(sl.utils.t_shopAudioPlaying);
if(audio.paused==false){
sl.utils.t_shopAudioPlaying=setTimeout(looping, 500);
}else{
sl.shop.audio.newSrc(which);
}
})()
}
},
newSrc: function(which){
document.getElementById("shop_audio").src = '/audios/helper/shop/en/help_instruction_'+which+'.mp3';
}
}
將clearTimeout()
放在不同的地方會有所不同,所以我追求這一點,但結果並不一致。
我現在已經刪除了所有clearTimeouts - 它們沒有任何區別。問題保持完全一樣。
感謝您的建議!
我喜歡你的代碼的外觀!更優雅。唯一的問題是問題不會消失,但現在第一條消息也會中止,重新啓動然後死亡。 (只在谷歌瀏覽器!其他地方都很好!!) – Daniela
@Daniela你可以創建一個plnkr http://plnkr.co來演示嗎?只有當音頻播放結束後,你是否試圖改變'audio'的src'? – guest271314
是的,當然。事情是其他瀏覽器沒有問題,只有Chrome。 – Daniela