2012-05-31 39 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页面上的不同内容。 –