0

私はデータベースに行き、いくつかの値を取得していくつかの値を設定する単純な.change関数を持っています。

$('.linequantity').change(function() {
    ...
    $.getJSON(url, function(data) {
      $('#TT-' + lineItem).text(parseFloat(data['price']) * quantity);
    });
});

次に、変更する線の数量のいずれかで、小計を更新したいと思います。(はい、カタログタイプ/ショッピングカートスタイルのアプリです)。私の考えは、.eachを使用しましょう

$('.linequantity').each(function(){
     ...
   var url = "jQueryFunctions.php?action=getPrice&quantity=" + quantity + "&customer=" + customerID + "&item=" + lineItem;

    $.getJSON(url, function(data) {
       subtotal = subtotal + (parseFloat(data['price']) * quantity);
     });
   });

   $('#subtotal').text(subtotal);

ただし、これを行うと、それぞれが発火したとしても、小計は0になります。

.eachを関数に入れるのに疲れました。.eachを独自の関数に移動すると、より一貫して起動しましたが、.changeで正常に機能するgetJSONはスキップされます。

最初のjsonリクエストの競合が発生した場合、別のリクエストをリクエストする前に完全ではありませんか?

私は方法論の変更を受け入れていますが、上記のことは正しい考え/開始を持っています。

何か案は?

EDITS
数量フィールド

<input type="text" class="linequantity" id="SQ-<?php echo $value['itemNumber']; ?>" name="Quantity" placeholder="#"/>

総スパン

<span id="subtotal" class="currencyField">$0.00</span>

11:44編集:getJsonが完了する前に.eachがヒットしていると思います。jQueryを実行しない前にjsonリクエストが完了したことを確認するにはどうすればよいですか?

4

2 に答える 2

1

ajaxリクエストの完了が遅すぎるという競合状態があると思います。これを回避する唯一の方法は、リクエストの完了後に実行されるリクエストに依存するメソッドを用意することです。Deferred やを使用するなど、これを行う方法はたくさんあります$.when。簡単な方法がいいでしょう:

$.getJSON(...)
   .done(function () {
      // Stuff that depends on JSON goes here
   });

.eachあなたは複数のリクエストに依存しています-おそらく一度にたくさん。私はこれを1つのリクエストで実行しようとします(たとえば、サーバーコードを更新して、アイテムのリストを受け入れ、一度に1つずつではなく、小計を計算します)。そうしないと、小計を継続的に更新する必要があり、視覚的にちらつく可能性があります。また、サーバーにとっても非効率的です。次のようなことができる場合があります。

var jqXHRs = []
$.each(...
   jqXHRs.append($.getJSON(...));
);
$.when(jqXHRs).done(...);

...しかし$.when、そのような配列で機能するかどうか、または引数リストをそれに拡張する方法があるかどうかはわかりません。

于 2012-05-31T16:45:24.740 に答える
-1

.change()は、要素、ボックス、および要素でのみ使用する必要があります。

そのことを念頭に置いて、おそらく$()。val();を呼び出す必要があります。アクティブなユーザー選択/入力データを取得します。

このような何かがそれをするかもしれません:

$('.linequantity').change(function() {
    var inputData = $(this).val();
    // other stuff!
});
于 2012-05-31T14:50:17.670 に答える