2

行をコメントアウト/削除するまでうまく機能するJavascript関数がありalert()ます。フィールドが存在し、値がある場合は、最大 30 個のフィールドの合計を計算します。

HTML:

<input type="text" onblur="Calculatenettobrutto(1);">

JavaScript:

function Calculatenettobrutto(n) {
  var Feldnummer=n;
  var nettowert,bruttowert;
  var nettosumme, bruttosumme,neuenettosumme,neuebruttosumme;
  var Wertfuer='Mehrwertsteuersatz'
  //Mehrwertsteuer auslesen
  var dataString = 'Name='+Wertfuer;
  var thisObject = this;
  this.wert=$.ajax({
    type: "POST",
    url: "ajax_get_Einstellungen.php",
    data: dataString,
    cache: false,
    success: function(wert) {
      nettowert = document.getElementById('Netto'+Feldnummer).value;
      bruttowert = parseFloat(nettowert) * wert;
      document.getElementById('Brutto'+Feldnummer).value=parseFloat(bruttowert);
      return wert;
    }
  });

  var nettosumme=0,bruttosumme=0, x=1;
  while (x < 30) {
  var Feldname='Netto'+x;
  if ( document.getElementById('Netto'+x) ) {
    //If field Netto+x exist then check if it has a value
    var nettowert=document.getElementById('Netto'+x).value;
    //if it has a value add values to nettosumme and bruttosumme
    if (nettowert) {
      nettosumme=parseFloat(nettosumme)+parseFloat(document.getElementById('Netto'+x).value);
      //IF I COMMENT THIS OUT, I get a NAN in my Bruttosumme column
      alert(nettosumme);
      bruttosumme=parseFloat(bruttosumme)+parseFloat(document.getElementById('Brutto'+x).value);
    }
  }
  x++;
}
document.getElementById('Nettosumme').value=parseFloat(nettosumme);
document.getElementById('Bruttosumme').value=parseFloat(bruttosumme);

}

alert()行が削除されても機能させるにはどうすればよいですか?

4

1 に答える 1

6

問題は、非同期 ajax リクエストを行うことです。

<input type="text" onblur="Calculatenettobrutto(1)" />

これはCalculatenettobrutto、ユーザーがフィールドを離れるとすぐに呼び出されます。次に、関数が呼び出されます。

var Feldnummer = 1;
this.wert=$.ajax({
   ...
   success: function(wert) {
      ...
      nettowert = document.getElementById('Netto'+Feldnummer).value;
      bruttowert = parseFloat(nettowert) * wert;
      document.getElementById('Brutto'+Feldnummer).value=parseFloat(bruttowert);
   }
});

//alert("Wait a little");
document.getElementById('Brutto'+Feldnummer).value <-- BANG

ここでの問題は次のとおりです。 ajax 呼び出しの結果がサーバーから返されたときに ajax() 内で定義された関数が呼び出され、ajax() の後のコードがすぐに実行されます。したがって、設定される前にフィールドから値を取得しようとします。

警告ウィンドウが表示されている間、スクリプトは一時停止され、ajax 呼び出しが返され、「Brutto...」の値を設定する「成功」コードが実行されます。アラートを閉じると、コードが実行され、"Brutto..." に値が設定されます。

おそらく最も簡単な解決策は、合計計算関数を「成功」関数に移動することです

于 2013-05-21T17:09:45.730 に答える