このコードは、div、div(実際にはテキストボックス)、およびtarget(数値)の2つの入力を受け取ります。次に、疑似アニメーションの方法で数値をインクリメント/デクリメントします。問題は、入力の1つの形式としてjQueryスライダーを使用していることです。これにより、最初の呼び出しが終了する前に複数の呼び出しが発生する可能性があります。スライダーをすばやく上げてから、ロールアップの増加が終了する前に下げて、divを永遠にデクリメントしない限り、これは問題になりません。何が原因なのかわかりません。考え?
function rollNum(div, target) {
var contentString = $(div).val();
content = parseInt(contentString.substring(1));
if(content === target)
return;
else if(div !== "#costMinusMSP" && div !== "#savingsWithMSP") {
var total = rollNumTotalCost(div, target);
rollNum("#costMinusMSP", total);
rollNum("#savingsWithMSP", total /*- somehow find the cost here*/)
}
if(isNaN(content))
content = 0;
var remainingChange = target - content;
if(remainingChange > 0)
loopUp();
else
loopDown();
function loopUp() {
var length = remainingChange.toString().length;
var incrementBy = 1;
//Find how far away we are from target
for(var i=0;i<length-1;i++)
incrementBy *= 10;
content += incrementBy;
remainingChange -= incrementBy;
$(div).val("$" + (content))
if(content === target)
return;
else if(content > target) {
$(div).val("$" + (target));
return;
}
setTimeout(loopUp, 60);
}
function loopDown() {
remainingChange = Math.abs(remainingChange);
var length = remainingChange.toString().length;
var decrementBy = 1;
//Find how far away we are from target
for(var i=0;i<length-1;i++)
decrementBy *= 10;
content -= decrementBy;
remainingChange -= decrementBy;
if(content < target) {
$(div).val("$" + (target));
return;
}
//This ensures we won't promise our clients negative values.
if(content <= 0) {
$(div).val("$0");
return;
}
$(div).val("$" + (content))
if(content === target)
return;
setTimeout(loopDown, 60);
}
}
不思議なことに、別のスライダー(無関係なdivを変更する)を調整すると、永遠の減少が修正されます。
私が試したこと:-関数がtrueに設定し、次にfalseに設定するブール値の「実行中」を作成してから戻ります。実行がtrueの場合、関数はfalseになるまで実行を続行します。これにより、ブラウザが強制終了されるか、最大スタックが達成されました。