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

时间:2011-12-26 20:02:13

标签: javascript jquery

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

      <table border="1" class="autoTable">
 <tr>

<td>Description</td><td>Stocked</td><td>Quantity</td><td>Part Price</td>
<td>Hours</td>    
<td>Rate Class</td><td>Total</td><td>Approved</td><td>Add New Row</td>    
<td>Remove Row</td></tr>
<tr>
<td><input name="description[]" id="description" value="<?php echo $description; ?>" size="55" class="numeric add_to_total" onKeyPress="return disableEnterKey(event)" />

</td><td align="center"><input type="checkbox"  name="stocked[]" id="stocked" value="<?php echo $stocked; ?>" size="5" class="numeric add_to_total" onKeyPress="return disableEnterKey(event)" />
</td><td><input name="quantity[]" id="quantity" value="<?php echo $quantity; ?>" size="5" class="numeric add_to_total quantity" onKeyPress="return disableEnterKey(event)" />
</td><td><input name="partPrice[]" id="partPrice" value="<?php echo $partPrice; ?>" size="10" class="numeric add_to_total part" onKeyPress="return disableEnterKey(event)" />
</td><td><input name="hours[]" id="hours" value="<?php echo $hours; ?>" size="10" class="numeric add_to_total hours" onKeyPress="return disableEnterKey(event)" />
</td><td><select name="rate[]" id="rate" class="numeric add_to_total rate" onKeyPress="return disableEnterKey(event)">
<?php
    //php code here for rates
?>
</select>
</td><td><input name="total[]" id="total" size="10" class="numeric is_total" onKeyPress="return disableEnterKey(event)" />
</td><td align="center"><input type="checkbox" name="approved[]" id="approved" value="<?php echo $approved; ?>" size="10" onKeyPress="return disableEnterKey(event)" />
</td><td align="center"><img src="img/plus.png" width="25" height="25" id="addButton" title="Add New Row" class="addRow" />
</td><td align="center"><img src="img/x.png" width="25" height="25" id="removeButton" title="Remove Row" class="delRow" />
</td></tr>
</table>

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

$(".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);
});

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

我看不到您的HTML中的add_to_totalquantityparthoursrateis_total类。 ,或者你试图在你的Javascript中选择哪些元素...希望这有帮助......

修改

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

http://api.jquery.com/live/(jQuery&lt; 1.7)

http://api.jquery.com/on/(jQuery&gt; = 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")的值,尽管实际上选择了一组元素...这只是.val()函数的功能。 jQuery的。你要做的就是为每一行进行流程计算,就像你说的那样。简化后,您需要获取当前TR的{​​{1}}元素,只关注其子元素,然后继续。

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

add_to_total

然后在Javascript中:

<tr class="dynamic_row"> ... </tr>

希望这有帮助! :)

答案 1 :(得分:0)

感谢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的新手,我不知道如何给予他任何功劳,除了接受他作为已接受的答案,并提升有用选项。

非常感谢!