计算动态添加项目到表格的总和

时间:2018-05-18 13:12:44

标签: javascript jquery

我想使用 itemPrice * Qty 字段计算每个项目的总计行数,行数量将在 linePrice 文本框中自动填充。然后,通过总结所有行价,将总计自动填充到 priceTotal 字段。

我遇到了将每个数量 itemPrice 文本框值都添加到我的JavaScript函数中的挑战,因为名称是 Qty0,Qty1,Qty2 ... itemPrice0,itemPrice1,.. ,具体取决于添加的行,并将最终计算结果放入相应的文本框中。

以下是我的代码。



 <!-- Latest compiled and minified CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

    <!-- Optional theme -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">

    <!-- Latest compiled and minified JavaScript -->
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>

<script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"></script>
    <script src="https://code.jquery.com/jquery-2.1.1.js"></script>
<table class="table table-bordered table-hover" id="tab_add">
  <tbody>
    <tr>
      <td colspan="2"><b>Customer Name</b></td>
      <td colspan="1">
        <select name="Per_Name[]" class="form-control">
          <option value="">Select Customer</option>
          <option value="2000001">John Doe</option>
          <option value="2000002">Jane Doe</option>
          <option value="2000003">Tom Harry</option>
          <option value="2000004">Steve Jobs</option>
        </select>
      </td>
    </tr>
    <tr id='addr0'>
      <td><b>1</b></td>
      <td><b>Select Item</b></td>
      <td colspan="1">
        <select name="Sub_Name[]" class="form-control">
          <option value="">Select Item</option>
          <option value="1000001">Item A</option>
          <option value="1000002">Item B</option>
          <option value="1000003">Item C</option>
          <option value="1000004">Item D</option>
        </select>
      </td>
      <td><input type="text" name="itemPrice0" id="itemPrice0" class="itemPrice form-control" placeholder="Unit Price"></td>
      <td><input type="number" name="Qty0" id="Qty0" class="Qty form-control" onkeypress="return isNumberKey(event)" placeholder="Quantity"></td>
      <td><input type="text" name="linePrice0" id="linePrice0" class="linePrice form-control" onkeypress="return isNumberKey(event)" placeholder="Line Price" readonly></td>
      <th>
        <a href="javascript:void(0);" style="font-size:18px;width:33%;" id="add_row" title="Add More Item"><span class="glyphicon glyphicon-plus"></span></a>
        <a href="javascript:void(0);" style="font-size:18px;width:33%;" id="delete_row" title="Remove Item"><span class="glyphicon glyphicon-minus"></span></a>
      </th>
    </tr>
    <tr id='addr1'></tr>
  </tbody>
</table>
<table class="table table-bordered table-hover">
  <tr id="finRow">
    <td colspan="2" width="75%"><b>TOTAL</b></td>
    <td><input type="text" name="priceTotal" id="priceTotal" class="row-total form-control" disabled></td>
  </tr>
</table>
&#13;
const app = await NestFactory.create(AppModule);
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:0)

这部分代码将计算每行的linePrice:

$("tr").each(function() {
  if ($(this).children("td").length) {
    $($($(this).children("td")[5]).children("input")[0]).val(

      (($($($(this).children("td")[4]).children("input")[0]).val()) ? Number($($($(this).children("td")[4]).children("input")[0]).val()) : 0) *
      (($($($(this).children("td")[3]).children("input")[0]).val()) ? Number($($($(this).children("td")[3]).children("input")[0]).val()) : 0)

    )
  }
});

答案 1 :(得分:0)

为了减少为完成此操作而必须执行的DOM遍历量,我建议在元素中添加data-*属性,以便获取索引并使用它直接引用其他元素。

<td><input type="text" name="itemPrice0" id="itemPrice0" data-index="0" class="itemPrice form-control" placeholder="Unit Price"></td>
<td><input type="number" name="Qty0" id="Qty0" data-index="0" class="Qty form-control" onkeypress="if(!isNumberKey(event)){return false;}" placeholder="Quantity"></td>
<td><input type="text" name="linePrice0" id="linePrice0" data-index="0" class="linePrice form-control" onkeypress="return isNumberKey(event)" placeholder="Line Price" readonly></td>

然后在$("#add_row").click(function() {函数中,我们在创建新元素时添加data-index='"+j+"' ...

$('#addr' + i).html("<td>" + (i + 1) + "</td><td><b>Select Item</b></td><td colspan='1'><select name='Sub_Name" + i + "' class='form-control'><option value=''>Select Item</option><option value='1000001'>Item A</option><option value='1000002'>Item B</option><option value='1000003'>Item C</option><option value='1000004'>Item D</option></select></td><td><input type='text' name='itemPrice" + i + "' id='itemPrice" + j + "' data-index='"+j+"' class='itemPrice form-control' placeholder='Unit Price'></td><td><input type='number' name='Qty" + i + "' id='Qty" + j + "' data-index='"+j+"' class='Qty form-control' onkeypress='return isNumberKey(event)' placeholder='Quantity'></td><td><input type='text' name='linePrice" + i + "' id='linePrice" + j + "' data-index='"+j+"' class='linePrice form-control' onkeypress='return isNumberKey(event)' placeholder='Line Price' readonly></td>");

最后,将您的keyup处理程序更改为...

$("#tab_add").on("keyup", ".Qty", function(e){

    var qtyPur = parseFloat(this.value);

    if (!isNaN(this.value) && this.value.length != 0) {

        // this is where use use the data-index attribute to dynamically generate the target element ids
        $("#linePrice"+$(this).data('index')).val(
            parseFloat($("#itemPrice"+$(this).data('index')).val()) * qtyPur
        );
     }

    calculateSum()

});

See Demo

答案 2 :(得分:-1)

function grosschanged_total1(a){

        var str = a;
        var res = str.split("_");
        //alert(res[2]);
        var result = res[2];

        var rate = parseFloat(document.getElementById("Gridview1_txtgross_" + result).value) * parseFloat(document.getElementById("Gridview1_txtrate_" + result).value);
        var scale77 = 2;
       // rate = roundNumberV2(rate, scale77);


        var gresult = 0.00;

        if(isNaN(rate)){
            gresult=  document.getElementById("Gridview1_txttotal_" + result).value = "";

        } else{
            gresult=  document.getElementById("Gridview1_txttotal_" + result).value = parseFloat(Math.round(rate * 100) / 100).toFixed(2);

        }
        //GridView1_txtinvamt_0

        var gfresult = parseFloat(gresult);

        var ggresult = 0.00;

        ggresult = gfresult + ggresult;

     //   $("[id*=lblGrandTotal]").html(ggresult);


        //GridView1_txtdelinvnum_0 + GridView1_txtinvamt_0 = GridView1_txtgrosspt_0
      //  Calculate();

        grosschanged_total1(a);

    }

    function Numerics(text) {

        var regexp = /^[0-9]*$/;

        if (text.value.search(regexp) == -1) {
            text.value = text.value.substring(0, (text.value.length - 1));
            alert('Numerics only allowed');
            if (text.value.search(regexp) == -1)
                text.value = "";
            text.focus();
            return false;
        }
        else
            return true;
    }