プロが教えるわが家の防犯対策術!

現在、以下のようなコードで電卓を作成しているのですが。
このコードだと足し算だけならできたのですが
引き算をすると二週目の計算に不具合が生じてしまいます。
例えばどのような不具合かと言うと
30 - 10 = 20 ←この段階では問題はありません。
しかし、この答えからさらに次の計算を行うと

20 - 5 = -15 ←このようになぜか負の値になってしまいます。
自分なりに何が原因なのかを調べてみたのですが
足し算のほうは問題なく表示されるだけに
なぜどこからとも無く-の記号が現れるのか分からない状況です。
ちなみにかけ算も試してみたのですがかけ算の場合は2週目の計算結果が0に
なってしまいます。
この問題はどのように記述すれば解決できるのでしょうか?

分かる方お願いします。

~~HTML~~

<body>

<span>
<div></div>
<section></section>
<section>

<ul> <li></li><li></li><li></li><li>AC</li> </ul>
<ul> <li>1</li><li>2</li><li>3</li><li>+</li> </ul>
<ul> <li>4</li><li>5</li><li>6</li><li>-</li> </ul>
<ul> <li>7</li><li>8</li><li>9</li><li>×</li> </ul>
<ul> <li>0</li><li>.</li><li>=</li><li>÷</li> </ul>

</section>
</span>

</body>

~~jQuery~~

/*数字の入力*/

$(".num").click(function(){
var num = $(this).text();

if(inputZ.text() == "" && num == 0){

inputZ.append(num + ".");

}
else{

inputZ.append(num);

}
});

/*リセット*/

$(".reset").click(function(){

inputZ.text("");
divTxt = Div.text("");

});

/*加算*/

$(".addition").click(function(){

if(inputZ.text() == ""){

leftFml_01 = rightFml_01

}
else{

leftFml_01 = parseFloat(inputZ.text());

}

inputZ.text("");
divTxt_01 = Div.text(leftFml_01 + " +");


Ans.click(function(){

if(inputZ.text() == ""){

rightFml_01 = leftFml_01;

}
else{

rightFml_01 = parseFloat(inputZ.text());

}

reply_01 = leftFml_01 + rightFml_01;

inputZ.text(reply_01);

leftFml_01 = null;
divTxt_01.text("");

});

});

/*減算*/

$(".subtraction").click(function(){

if(inputZ.text() == ""){

leftFml_02 = rightFml_02

}
else{

leftFml_02 = parseFloat(inputZ.text());

}

rightFml_02 = null;

inputZ.text("");
divTxt_02 = Div.text(leftFml_02 + " -");


Ans.click(function(){

if(inputZ.text() == ""){

rightFml_02 = leftFml_02;

}
else{

rightFml_02 = parseFloat(inputZ.text());

}

reply_02 = leftFml_02 - rightFml_02;

inputZ.text(reply_02);

leftFml_02 = null;
divTxt_02.text("");

});
});
});

A 回答 (1件)

演算が行われる度に


イベントリスナが
Ans.click(function(){
で登録されているからです

新しいイベントリスナを登録しても
古いのが消えたりはしません
どんどん溜まっていき、1回のクリックでいくつも呼ばれることになります

その結果

1番目に呼ばれたイベントリスナで

reply_02 = leftFml_02 - rightFml_02;
が例えば
30 - 10

reply_02 に20が入りinputZが20になります


次は
inputZがrightFml_02になり、leftFml_02 は nullになっているので

null - 20

inputZが-20になります

もしイベントリスナが3つ登録されていれば
さらに
null - -20
となって
20に

4つならば
また-20になります

こういった現象がおきています

簡単なのは
unbind("click")
を全ての
Ans.click(function(){
の前において

イベントリスナをクリアすることです
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

まだ勉強不足でイベントリスナというものを知らないので全ては理解できませんが
それは自分で調べるとして
未熟な僕でもだいたいは分かるくらい丁寧に回答して頂いてることは分かりましたし
原因を教えていただけたので何倍も調べやすくなりました。

ありがとうございました。

お礼日時:2013/05/29 23:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!