javascript - 關(guān)于audio標簽暫停的問題
問題描述
<audio src='http://m.cgvv.com.cn/wenda/res/bg.mp3' controls loop></audio> <input type='checkbox' />:是否播放背景音樂 <script>bgm.onchange=function(){ if(this.checked){m1.volume=0;m1.play();var timer=setInterval(function(){ m1.volume+=0.1; if(m1.volume>0.9){clearInterval(timer); }},200); }else{var timer=setInterval(function(){ if(m1.volume>0){m1.volume-=0.1; }else{clearInterval(timer);m1.pause(); }},200); }} </script>
代碼如上,想要做一個點擊checkbox實現(xiàn)背景音樂淡入淡出的小功能,淡入可以實現(xiàn),但是淡出時,我想要音量變?yōu)?時,自動暫停。但是我這個音量變?yōu)?之后,進度條仍然在走,m1.pause()沒有生效。。
實在搞不明白,前端小白,求指導π-π
問題解答
回答1:這個問題比較好玩,代碼的邏輯是沒問題的。
首先需要了解的是:js中浮點數(shù)的計算不精確的,比如:0.2 + 0.1結(jié)果是0.30000000000000004。
然后直接原因是報錯:Failed to set the ’volume’ property on ’HTMLMediaElement’: The volume provided (-1.77636e-16) is outside the range [0, 1].這是在說volume只能在[0, 1]的區(qū)間內(nèi)賦值。
漸入時,每次加 0.1,實際volume的值打印出來是:
volume每次減 0.1,實際減到最后會產(chǎn)生一個非常非常小的數(shù),但仍大于 0:
所以仍會執(zhí)行m1.volume-=0.1導致volume被設(shè)置為負數(shù)報上面的錯。
解決方案已經(jīng)有同學給出了。另外可以關(guān)注下 ES6 Number.EPSILON,專門用于解決計算精度問題。
回答2:問題出在volume的值,在HTML5規(guī)范中,volume的值是不能小于0的,但你代碼中的計算使volume的值小于0了,故腳本出錯了不再執(zhí)行。建議改成
if(m1.volume>0.1){ m1.volume-=0.1;}else{ clearInterval(timer); m1.pause();}
這是錯誤記錄:Failed to set the ’volume’ property on ’HTMLMediaElement’: The volume provided (1.1) is outside the range [0, 1]另外,代碼沒有通過連續(xù)點擊測試,聲音沒達到最大時再點checkbox,會出現(xiàn)bug.
回答3:改成這樣:
var timer = null; bgm.onchange=function(){if(this.checked){ m1.volume=0; m1.play(); clearInterval(timer); timer=setInterval(function(){m1.volume+=0.1;if(m1.volume>0.9){ clearInterval(timer);} },200);}else{ clearInterval(timer); timer=setInterval(function(){console.log(m1.volume)if(m1.volume>0){ // m1.volume -= 0.1;這里會有精度問題,一直減0.1不是到從1到0 m1.volume = m1.volume-0.1<=0?0:m1.volume-0.1;}else{ m1.pause(); clearInterval(timer);} },200);} }`
相關(guān)文章:
1. 這是什么情況???2. javascript - 關(guān)于input="file",重復選擇同一文件時不觸發(fā)change事件的問題3. thinkphp3 count()方法必須加上字段?4. mysql 5個left關(guān)鍵 然后再用搜索條件 幾千條數(shù)據(jù)就會卡,如何解決呢5. python - 《flask web 開發(fā)》一書,數(shù)據(jù)庫中多對多關(guān)系的實現(xiàn)問題?6. python - 這句是什么錯誤?7. 輸入地址報以下截圖錯誤,怎么辦?8. mysql - SQL server 誤用delete 怎么恢復?9. 怎么php怎么通過數(shù)組顯示sql查詢結(jié)果呢,查詢結(jié)果有多條,如圖。我要forsearch里面echo10. python中return 語句與 分支語句連用問題
