2012-05-31 41 views
0

我有一個簡單的.change函數進入數據庫,並獲取一些值來設置一些值等。jQuery .change with .each inside not firing properly

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

我想要的是,在任何linequantites改變,我想更新小計。 (是的,這是一個目錄類型/購物車風格的應用程序)。我的想法是,讓我們使用。每個

$('.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移到它自己的函數中時,它會更加一致地觸發,但getJSON(在.change中工作正常)會被跳過。

我在遇到第一個json請求時發生衝突並不是很完整,然後再詢問另一個請求嗎?

我很樂意改變方法論,但上面的東西有正確的想法/開始。

任何想法?

編輯
數量字段

<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完成之前。每個被擊中。我如何確保json請求在我不jQuery之前完成

+0

什麼HTML元素有'linequantity'類?你可以包含你的HTML嗎? – ManseUK

+0

@ManseUK輸入 –

+0

您可以爲'getSubtotal'創建一個'action',因此您不必在循環中執行此操作。 –

回答

1

我覺得你只是有一個競爭條件,由此AJAX請求完成爲時已晚。解決這個問題的唯一方法是獲取依賴於完成後運行的請求的方法。有很多方法可以做到這一點,例如使用Deferred$.when。最簡單的方法將是不錯:

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

.each你是依賴於多個請求 - 可能很多的時間。我會嘗試在一個請求中執行此操作(例如,更新您的服務器代碼以接受項目列表並計算小計,而不是一次只有一個)。否則,您必須不斷更新小計,這可能會導致其在視覺上閃爍。這對服務器來說也是低效的。您可以做一些事情,如:

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

...但我不知道是否$.when將像一個數組工作,或是否有任何方式來擴大參數列表吧。

+0

我結束了與這個問題完全不同的路線,但讀了很多關於jQuery事件。 .done是確保事件在完成之前完成的關鍵。我接受,因爲你開始走下坡路。謝謝您的幫助。 –

-1

.change()只能用於元素,框和元素。考慮到這一點,你可能需要調用$()。val();}。獲取活動的用戶選擇/輸入數據。

這樣的事情可能做到這一點:

$('.linequantity').change(function() { 
    var inputData = $(this).val(); 
    // other stuff! 
}); 
+0

.change位於輸入字段之上。 getJSON之上的...是.val調用來獲取html頁面上的不同內容。 –