• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Alertを入れるときといれない時の違い)

Ajaxを使ったデータの表示と計算でAlertの有無による違い

このQ&Aのポイント
  • Ajaxを使用してテキストボックスにデータを反映させ、そのデータを計算して別のテキストボックスに表示するプログラムを作成しています。
  • しかし、データを計算して表示させる部分で問題が発生しています。Alertを使わずに計算を行うとNaNという結果が表示され、正しく計算ができません。
  • 一方、Alertを入れると計算が正しく行われ、予想通りの結果が表示されます。なぜAlertを入れることで正しく計算が行われるのか、理由が分かりません。

質問者が選んだベストアンサー

  • ベストアンサー
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.3

こんにちは。 ソースありがとうございました。 拝見しましたがやはり合計を求めるロジックがサーバ呼出し後に呼ばれるメソッド内に無いために起きる現象です。 似たようなのを作って試してみました。 su2の合計だけNaNになりませんか? サーバ側からレスポンスを返すのをわざと遅くしてみると良くわかるのですが$.ajaxにてサーバ通信を行い、値が返ってくる前に既に合計計算のロジックが動きます。 なので、正確に計算できません。 合計を求める部分のロジックを$.ajaxの中に入れてください。 イメージは success : function ( result ) { if ( result != '' ) { var kekka = result.split(','); su = parseInt ( kekka[0] ); alert ( "from server = " + su ); $('#A2-'+no).val ( parseInt($('#A1-'+no).val())*su); } var su1 = 0; var su2 = 0; for ( var i = 1; i <= 5; i ++ ) { if ( $('#A1-'+i).val() != '' ) { su1 = parseInt(su1)+parseInt($('#A1-'+i).val()); su2 = parseInt(su2)+parseInt($('#A2-'+i).val()); } } $('#kei1').val ( su1 ); $('#kei2').val ( su2 ); } こんな感じです。

noname#223023
質問者

お礼

LancerVIIさん ご回答ありがとうございました! はい、su2の合計だけNaNになります。 処理を全部$.ajaxの中に入れないとダメなんですね! 非同期通信。。そういわれてみれば、Ajaxってそうなんですよね。。 基本的なところが抜けておりました! ご丁寧に教えてくださって本当にありがとうございました! また何かございましたらぜひよろしくお願いします♪ 本当にありがとうございました!!

その他の回答 (2)

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.2

こんにちは。 合計の出し方は問題ないと思います。 ちょっと試してみましたが、空白でも問題なく計算されているのでNo1の回答はちょっと間違っています。 Ajaxでのサーバ呼び出し部分とサーバからの値を処理する部分、合計を出す部分のソースは出せませんか? いつどうやって戻ってきた値をセットしていつforで合計を出しているか。 想像で作ってみて試してみているのですが同じような現象にたどり着けませんでした。

noname#223023
質問者

お礼

LancerVIIさん ご回答ありがとうございます。 A1-1といIDのうテキストボックスに入力後、その値を取り出してCGIに渡し、 計算させたあと、A2-1というテキストボックスに入れます。 そのセットが、(A1-1,A2-1),(A1-2,A2-2),(A1-3,A2-3),(A1-4,A2-4),(A1-5,A2-5)とあり、 合計でkei1,kei2のテキストボックスに入れるとします。 noは取得したテキストボックスのIDの枝番です。 $.ajax({ type: 'GET', url: '******.cgi', data: 'code=' + $('#A1-'+no).val() , success: function(result){ if (result != ''){ var kekka = result.split(','); su=parseInt(kekka[0]); $('#A2-'+no).val(parseInt($('#A1-' + no).val())*su); } } }); for(i=1; i<=5; i++){ if($('#A1-' + i).val() != ''){ su1 = parseInt(su1)+parseInt($('#A1-' + i).val()); su2 = parseInt(su2)+parseInt($('#A2-' + i).val()); } } $('#kei1').val(su1); $('#kei2').val(su2); このような式を書いています。 間違っているところがございましたらご指摘下さい。 お忙しいところありがとうございます。 よろしくお願いいたします。

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 ソースが無いので何とも言えませんが、きちんとコールバック時にテキストボックスを参照していますか? 非同期で通信するのでサーバにリクエスト投げた後すぐに計算するロジックになってると値が無いって言われると思います。 コールバック関数内でサーバよりデータを受け取って、それをテキストボックスにセットし、計算を実行する必要があります。 既にそういう作りになっていたら申し訳ございません。

noname#223023
質問者

お礼

LancerVIIさん ご回答ありがとうございました。 例えばAというIDがついたテキストボックスに $('#A').val(CGIから戻ってきた値を計算させたもの); このようにテキストボックスに入れて、その後、このテキストボックスを含んだ他のテキストボックスも参照し、forで回して合計を計算させています。 このやり方ですと間違っていますでしょうか。教えて頂けましたら嬉しいです。 よろしくお願いいたします。

関連するQ&A