0

フォームの前半の他のデータの結果に基づいて計算された3つの要素(Qty、UnitCost、およびTotalPrice)を持つフォームがあります。

QtyとUnitCostはjqueryGetに基づいて適切に入力されていますが、以前のフィールドで変更を加えない限り(その後、正しく更新されます)、単純な古いjavascriptを使用している合計価格は更新されません。

私はまだjqueryに非常に慣れておらず、自分自身を教えているので、何かが足りない可能性があります。

フォームは次のようになります

A(テキスト)、B(ドロップダウン)、C(ドロップダウン)、数量、UnitCost、TotalPrice

//Get the unit cost
$.get("calcCost.php", {item:item}, function(data) {
    document.getElementById(unitCostField).value = data;
});
unitCost = document.getElementById(unitCostFiled).value;

Qtyのコードは基本的に同じです-フィールドとphpスクリプトだけがアラートされます。どちらも正しく機能しています。

ただし、TotalPrice(Qty * UnitCost)を計算しようとすると、すぐには更新されません。これは0として始まります。これは、数量または単価のいずれかがまだ入力されていない場合に予想されます。

//Total Cost
cost = unitCost * qty
document.getElementById(costField).value = cost;

(document.getElementById内の変数は、他の場所ですでに定義されています);

何か案は?

4

2 に答える 2

1

AJAX の A は非同期を表していることを覚えておく必要があります。これは、AJAX 要求の結果がすぐに使用できるわけではないことを意味します。代わりに、ブラウザはリクエストを実行し、コールスタックにある他のすべてを終了し、その時までにリクエストが応答を返した場合にのみ、ajax の成功が実行されます。

Qty と UnitCost の両方のリクエストが完了した後、両方が成功した場合にのみ、コスト計算ルーチンを実行する必要があるため、提供した例はさらに興味深いものです。このような問題、特にすでに jquery を使用している場合、最適な解決策は Deferred オブジェクトだと思います。

$.whenのjquery ドキュメント(使用を検討する方法) は、あなたの問題とほぼ同じ問題の解決策を示しています。ただし、便宜上 (簡潔にするためにエラー ハンドラは省略しています):

var calcCostReq = $.get("calcCost.php", {item:item}).done(function(data) {
    document.getElementById(unitCostField).value = data;
    unitCost = document.getElementById(unitCostFiled).value;
});
var qtyReq = $.get("qty.php").done(function(data) {
    //whatever you need to do when qty was successful
});
$.when(calcCostReq, qtyReq).done(function() {
    cost = unitCost * qty
    document.getElementById(costField).value = cost;
}
于 2013-03-04T06:51:14.833 に答える
0

unitCostFieldAJAXリクエストによって入力される前に値を取得しています。unitCost割り当てはメソッドの下にありますが$.get、AJAXリクエストが終了する前に実行されます。

AJAXリクエストに依存するコードは、コールバック関数内で処理する必要があります。

var qty;

function calcCost() {
    var unitCost = document.getElementById(unitCostField).value,
        cost = unitCost * qty;
    document.getElementById(costField).value = cost;
}

$.get("calcCost.php", {item:item}, function(data) {
    document.getElementById(unitCostField).value = data;
    calcCost();
});
于 2013-03-04T06:07:50.220 に答える