动态字段 – 添加总计 – 每行

我有一个问题,我希望有人遇到过,可以提供帮助。 我发布了一个类似的问题(已解决),但对新问题没有进一步的帮助,所以我想我会发布这个问题(对不起,如果这是禁忌)。

DescriptionStockedQuantityPart Price Hours Rate ClassTotalApprovedAdd New Row Remove Row
<input name="description[]" id="description" value="" size="55" class="numeric add_to_total" onKeyPress="return disableEnterKey(event)" /> <input type="checkbox" name="stocked[]" id="stocked" value="" size="5" class="numeric add_to_total" onKeyPress="return disableEnterKey(event)" /> <input name="quantity[]" id="quantity" value="" size="5" class="numeric add_to_total quantity" onKeyPress="return disableEnterKey(event)" /> <input name="partPrice[]" id="partPrice" value="" size="10" class="numeric add_to_total part" onKeyPress="return disableEnterKey(event)" /> <input name="hours[]" id="hours" value="" size="10" class="numeric add_to_total hours" onKeyPress="return disableEnterKey(event)" /> <input type="checkbox" name="approved[]" id="approved" value="" size="10" onKeyPress="return disableEnterKey(event)" />

我使用以下代码来添加总行,但它不适用于第二个和后续的动态行。

 $(".add_to_total").change(function() { var total = 0; $(".add_to_total").each(function() { var quantity = parseFloat($(".quantity").val()) || 0; var part = parseFloat($(".part").val()) || 0; var hours = parseFloat($(".hours").val()) || 0; var rate = parseFloat($(".rate").val()) || 0; total = (Number(quantity) * Number(part)) + (Number(rate) * Number(hours)); }); $(".is_total").val(total); }); 

我希望有人可以帮助我…我已经尝试了所有我能想到的东西,而且我真的想让这个东西得到解决,继续我的生活:)

提前致谢。

我没有看到你的HTML中的类add_to_totalquantityparthoursrateis_totalis_total ,或者你试图在Javascript中选择哪些元素……希望这有助于……

编辑:

再考虑一下,可能是由于新添加的行’ add_to_total分类元素没有被绑定到更改事件。 您是否考虑过使用.live() / .on() jQuery事件(取决于您使用的jQuery版本)?

http://api.jquery.com/live/(jQuery <1.7)

http://api.jquery.com/on/ (jQuery> = 1.7)

也许实现了这样的事情:

 // using the .live() event... $(".add_to_total").live('change', function(){ ... }); // using the .on() event... $(".add_to_total").on('change', function(){ ... }); 

编辑:

哈哈! 希望最后编辑! 好吧,考虑以下代码:

 var quantity = parseFloat($(".quantity").val()) || 0; 

这将始终返回第一个 $(".quantity")的值,尽管实际上选择了一组元素……这只是jQuery中.val()函数的function。 你要做的就是为每一行进行流程计算,就像你说的那样。 简化后,您需要获取当前add_to_totalTR元素,仅关注其子元素,然后继续。

显然这正在处理大量不必要的计算,我建议在每个需要对它们进行计算的行中添加一个类,然后直接循环它们:

  ...  

然后在Javascript中:

 $(".add_to_total").on('change', function() { var total = 0; $(".dynamic_row").each(function() { var row = $(this); var quantity = parseFloat(row.find(".quantity").val()) || 0; var part = parseFloat(row.find(".part").val()) || 0; var hours = parseFloat(row.find(".hours").val()) || 0; var rate = parseFloat(row.find(".rate").val()) || 0; total = (Number(quantity) * Number(part)) + (Number(rate) * Number(hours)); }); row.find(".is_total").val(total); }); 

希望这可以帮助! 🙂

感谢Chris的建议,我移动了row.find(".is_total").val(total); 与行相关联。 在他的建议中,他把它放在声明它的元素之外,所以我觉得这个函数不知道我们在说什么。

我也改变了
$(".add_to_total").change(function() {
至:
$(".add_to_total").live('change',function() {
为了使它在每次出现时起作用,正如我从他的编辑#3中理解的那样。

所以计算总数的最终函数是:

 $(".add_to_total").live('change',function() { var total = 0; $(".dynamic_row").each(function() { var row = $(this); var quantity = parseFloat(row.find(".quantity").val()) || 0; var part = parseFloat(row.find(".part").val()) || 0; var hours = parseFloat(row.find(".hours").val()) || 0; var rate = parseFloat(row.find(".rate").val()) || 0; total = (Number(quantity) * Number(part)) + (Number(rate) * Number(hours)); row.find(".is_total").val(total); }); }); 

由于我是Stack Overflow的相对新手,我不知道如何给予他任何功劳,除了接受他作为已接受的答案,并提升有用选项。

非常感谢你!