Jquery,计算字段总和(动态)

时间:2012-03-28 02:28:50

标签: jquery html

我进行过搜索,但没有发现任何我想要做的事情。

我有一个动态表单,每个项目有2个输入框,1表示值,另一个表示数量。 E.g。

<table class="table table-striped table-condensed table-bordered">
<thead>
    <tr>
        <th>Item</th>
        <th width="20%">Value</th>
        <th width="20%">Quantity</th>
        <th class="actions">Total</th>
    </tr>
</thead>
<tbody>
    <tr>
        <td>Item</td>
        <td><input type="text" class="input-small" name="var_1" value="0"></td>
        <td><input type="text" class="input-small" name="var_1_1" value="0"></td>
        <td>$<span class="amount"></span> </td>
    </tr>
    <tr>
        <td>Item</td>
        <td><input type="text" class="input-small" name="var_2" value="0"></td>
        <td><input type="text" class="input-small" name="var_2_2" value="0"></td>
        <td>$<span class="amount"></span> </td>
    </tr>
    <tr>
        <td colspan="3"><strong>Total event cost (viability)</strong></td>
        <td><strong>$<div class="total_amount">total</div></strong></td>
    </tr>
</tbody>

所以我需要计算val_1 X val_1_1 =总数,然后在结尾添加总数(对于每个项目)。

我希望我能找到适用于无限项目的东西。

3 个答案:

答案 0 :(得分:8)

这是怎么回事: jsFiddle example

jQuery的:

function doCalc() {
    var total = 0;
    $('tr').each(function() {
        $(this).find('span.amount').html($('input:eq(0)', this).val() * $('input:eq(1)', this).val());
    });
    $('.amount').each(function() {
        total += parseInt($(this).text(),10);
    });
    $('div.total_amount').html(total);
}
$('button').click(doCalc);​

答案 1 :(得分:1)

您最大的问题是,您没有简单的方法来确保您确定哪些字段是值,哪些字段是数量。您编写它的方式,任何带有单个下划线的字段名称都可以是值,但是名为“some_value_1”的字段呢?

使用表定位是一个很好的解决方案,只要没有人为您的表添加更多列。我认为您应该使用一个类来指示哪些字段是值,哪些是数量。

无论如何,我的解决方案,为了清晰起见略显冗长:

    <form>
        <label>cost: <input type="text" name="cost_1" size="5" class="summable"/></label> 
        <label>qty: <input type="text" name="cost_1_qty" size="2"/></label><br/>

        <label>cost: <input type="text" name="cost_2" size="5" class="summable"/></label> 
        <label>qty: <input type="text" name="cost_2_qty" size="2"/></label><br/>

        <label>cost: <input type="text" name="cost_3" size="5" class="summable"/></label> 
        <label>qty: <input type="text" name="cost_3_qty" size="2"/></label><br/>

        <strong id="summation"></strong><br/>
    </form>
    <script type="text/javascript">

        function doTotal() {
            var total = 0.0;

            $(".summable").each(function (idx, element) {
                $this = $(this);

                var cost = parseFloat($this.val());
                var qty_selector = '[name=' + $this.attr('name') + '_qty' + ']'; // eg: [name=cost_3_qty]
                var qty = parseFloat($(qty_selector).val());
                if (cost && qty)
                    total += cost * qty ;
            });

            $("#summation").html(total.toFixed(2));
        }

        $(document).ready(function() {
            $("input[type=text]").blur(function (e) {
                doTotal();
            })
        });         
    </script>

答案 2 :(得分:0)

我认为这会做你想要的。

function calcCost() {
  var total = 0;

  $('table tr').each( function() {
    if ( $(this).find('td').length && $(this).find('td input').length ) {
      var quant = parseInt($(this).find('td input').eq(0).val()),
      price = parseInt($(this).find('td input').eq(1).val());
      $(this).find('.amount').html(quant * price);
      total += quant * price;
    }
  });

  $('.total_amount').html(total);
}

calcCost();

$('input').on('keyup', function() {
  calcCost();
});