2017-04-10 9 views
0

私は時間の経過とともにオーディオ要素の音量をフェードインしようとしています。JavascriptはsetIntervalを超過して値をデクリメントし&クリアしますか?

以下は私が嘲笑したjavascriptです。したがって、シナリオは、ボタンをクリックすると、この関数を実行します。

音量は時間の経過とともに-0.1で減少します。ボリュームが0のときは、間隔をクリアします...関数は実行されますが、間隔はクリアされません。何が間違っていますか?

var setVolume = function(){ 
    var volume = 1; 
    var fadeVolume = setInterval(function(){ 
     volume -= 0.1; 
     audio[0].volume = volume; 
     console.log(volume); 
    }, 100); 
    if(volume === 0) { 
     clearInterval(fadeVolume); 
    } 
} 

ありがとうございます。

+4

私はあなたが問題を参照してくださいよと思いますか? –

答えて

2

それは、障害の浮動小数点数の表現(とも他の回答で述べたようにclearIntervalを使用した場合)です。浮動小数点数の同等性はしばしば問題であり、このような状況では、浮動小数点数を助けることができれば、浮動小数点数を使用するのが最善の方法です。

> x = 1 
1 
> x -= 0.1 
0.9 
> x -= 0.1 
0.8 
> x -= 0.1 
0.7000000000000001 

代わりに整数を使用することをおすすめします。このよう

:あなたの現在のコードでは、* *あなたは間隔をクリアしているとき:あなたはこの質問に答えるとhttps://jsfiddle.net/6wfk0tgj/

var volume = 100; 
var fadeVolume = setInterval(function(){ 
    volume -= 10; 
    // If audio really needs to be a float then you could do: 
    audio[0].volume = volume/100; 
    console.log(volume); 
    if(volume === 0) { 
     clearInterval(fadeVolume); 
    } 
}, 100); 
+0

ありがとうございました...問題のようです。私は最初にsetInterval内の間隔をクリアしました。残念ながら、音量は0と1の間の値しか取らないようです。 – giantqtipz

+1

私は答えを修正しました – dpwrussell

+1

または条件を 'if(volume <= 0)'に設定するだけです。 – RobG

0

あなたは間隔コールバック内てclearInterval関数を呼び出す必要があります。

var setVolume = function(){ 
    var volume = 1; 
    var fadeVolume = setInterval(function(){ 
     volume -= 0.1; 
     audio[0].volume = volume; 
     console.log(volume); 
     if(volume === 0) { 
      clearInterval(fadeVolume); 
     } 
    }, 100); 

} 
関連する問題