1

What I want to do is when user enter quantity and unit price, the total amount will auto prompt, but now the problem is when user add a new row, the dynamical row its does not taking the calculations. Anyone have any idea on how to do it?

I'm not sure whether my coding is right or wrong because I not very familiar with jQuery. Fiddle

<table>
  <thead>
    <tr>
      <th>Action</th>
      <th>Description</th>
      <th>Qty</th>
      <th>Unit Price</th>
      <th>Amount</th>
       <th>Tax</th>
    </tr>
  </thead>
  <tbody class="items_table">
    <tr class="item-row">
      <td><button id="delete" href="javascript:;" onclick="deleteRow(this)" title="Remove row">Delete</button></td>
      <td><input class="form-control row-desc" id="desc" rows="1"></td>
      <td><input class="form-control tx-right row-qty" type="text" id="qty" onkeyup="calc()" value="0"></td>
      <td><input class="form-control tx-right row-unitprice" type="text" id="unitprice" value="0"></td>
      <td><input class="form-control tx-right row-amount" type="text" id="amount" disabled></td>
      <td>
        <input class="form-control tx-right row-tax" type="text" id="amounttax"></td>
    </tr>
   
  </tbody>
  <tr id="hiderow">
    <td colspan="7" class="tx-center tx-15"><b><a id="addrow" href="javascript:;" title="Add a row"><i class="fe fe-plus-circle"></i>Add an Item</a></b></td>
  </tr>
</table>
<br><br>


        $(document).ready(function() {
          AddItem();
          $('#addrow').click(function() {
            addItem();
          });
          $('.delete-row').click(function() {
            deleteRow(btn);
          });
                      $('#qty').on('keyup', 'input', function () {
                inputs = $(this).parents('tr');
                calc(inputs); 
            });
        });

        function deleteRow(btn) {
          var row = btn.parentNode.parentNode;
          var next = row.parentNode.rows[row.rowIndex + 0];
          row.parentNode.removeChild(next);
          row.parentNode.removeChild(row);
        }

        function addItem() {

          var itemRow =
            `<tr class="item-row">
            <td><button class="delete-row" href="javascript:; "onclick = "deleteRow(this)">Delete</button></td>
            <td><textarea class="form-control row-desc" id="desc" rows="1"></textarea></td> 
            <td><input class="form-control tx-right row-qty" type="text" id="qty" onkeyup="calc()" value="0"></td>
            <td><input class="form-control tx-right row-unitprice" type="text" id="unitprice" value="0"></td>
            <td><input class="form-control tx-right row-amount" type="text" id="amount" disabled></td>
          <td><input class="form-control tx-right row-tax" type="text" id="amounttax"></td>
            </tr>` ;

          $(".items_table").append(itemRow);

        }

        function AddItem() {
          $("#btnAddItem").click(function(e) {
            //arrayItem
            var arrayItem = [];
            var sArrayItem = "";

        $.each($(".items_table .item-row"),function(index,value){

        let desc = $(this).find(".row-desc").val()
        let qty = $(this).find(".row-qty").val()
        let unitprice = $(this).find(".row-unitprice").val()
        let amount = $(this).find(".row-amount").val()
        let tax = $(this).find(".row-tax").val()
        let item = {
          ItemDesc: desc,
          ItemUnitPrice:unitprice,
          ItemQty: qty,
          TaxAmount: tax,
          ItemTotalAmount: amount,
        }
        arrayItem.push(item)
        });
            sArrayItem = JSON.stringify(arrayItem);

            $.ajax({
              type: "POST",
              url: "AddItem",
              data: JSON.stringify({
                sArrayItem
              }),
              contentType: "application/json; charset=utf-8",
              dataType: "json",
              success: function(result) {

                if (result.d.indexOf(".aspx") != -1)
                  window.location.href = result.d;
                else
                  showPopup(result);
              },
              failure: function(response) {
                alert(response.d);
              }
            });
          });
        };
        function calc(inputs) {

            //get all of the various input typs from the rows
            //each will be any array of elements
            var Quantitys = $('.row-qty');
            var UnitPrices = $('.row-unitprice');
            var Amounts = $('.row-amount');

//at result, I only able auto prompt the first row, he second row onwards it does not auto prompt the amount when user enter qty & unitprice.
            $.each($(".items_table .item-row"),function (i, value) {

                // get all the elements for the current row
                var Quantity = $(this).find('.row-qty').val();
                var UnitPrice = $(this).find('.row-unitprice').val();
                var Amount = $(this).find('.row-amount').val();
               
                ////// get the needed values from this row
                var qty = Quantity.val();
                qty = qty == '' ? 0 : qty; // if blank default to 0
                Quantity.val(qty); // set the value back, in case we had to remove soemthing
                var price = UnitPrice.val();
                price = price == '' ? 0 : price; // if blank default to 0
                UnitPrice.val(price); // set the value back, in case we had to remove soemthing

                // get/set row tax and total
                // also add to our totals for later
                var rowPrice = (UnitPrice * 1000) * Quantity
                var total = rowPrice

                Amount.val((total / 1000).toFixed(2));

            });

        }
marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
qq games
  • 57
  • 6
  • Does this answer your question? [Event binding on dynamically created elements?](https://stackoverflow.com/questions/203198/event-binding-on-dynamically-created-elements) – freedomn-m Feb 24 '21 at 11:41
  • But i was using the class to do the calculation not the id in my coding – qq games Feb 24 '21 at 11:48
  • sorry, i still cannot get ur meaning. Can you use the fiddle and show me? – qq games Feb 24 '21 at 12:03

1 Answers1

0

you do lot of mixture between data and selector:

following your code, the amount is calculated only when you put something in Quantity (keyup function):

$(document).ready(function() {
  AddItem();
  $('#addrow').click(function() {
    addItem();
  });
  $('.delete-row').click(function() {
    deleteRow(btn);
  });
  $('#qty').on('keyup', 'input', function() {
    inputs = $(this).parents('tr');
    calc(inputs);
  });
});

function deleteRow(btn) {
  var row = btn.parentNode.parentNode;
  var next = row.parentNode.rows[row.rowIndex + 0];
  row.parentNode.removeChild(next);
  row.parentNode.removeChild(row);
}

function addItem() {

  var itemRow =
    `<tr class="item-row">
            <td><button class="delete-row" href="javascript:; "onclick = "deleteRow(this)">Delete</button></td>
            <td><textarea class="form-control row-desc" id="desc" rows="1"></textarea></td> 
            <td><input class="form-control tx-right row-qty" type="text" id="qty" onkeyup="calc()" value="0"></td>
            <td><input class="form-control tx-right row-unitprice" type="text" id="unitprice" value="0"></td>
            <td><input class="form-control tx-right row-amount" type="text" id="amount" disabled></td>
          <td><input class="form-control tx-right row-tax" type="text" id="amounttax"></td>
            </tr>`;

  $(".items_table").append(itemRow);

}

function AddItem() {
  $("#btnAddItem").click(function(e) {
    //arrayItem
    var arrayItem = [];
    var sArrayItem = "";

    $.each($(".items_table .item-row"), function(index, value) {

      let desc = $(this).find(".row-desc").val()
      let qty = $(this).find(".row-qty").val()
      let unitprice = $(this).find(".row-unitprice").val()
      let amount = $(this).find(".row-amount").val()
      let tax = $(this).find(".row-tax").val()
      let item = {
        ItemDesc: desc,
        ItemUnitPrice: unitprice,
        ItemQty: qty,
        TaxAmount: tax,
        ItemTotalAmount: amount,
      }
      arrayItem.push(item)
    });
    sArrayItem = JSON.stringify(arrayItem);

    $.ajax({
      type: "POST",
      url: "AddItem",
      data: JSON.stringify({
        sArrayItem
      }),
      contentType: "application/json; charset=utf-8",
      dataType: "json",
      success: function(result) {

        if (result.d.indexOf(".aspx") != -1)
          window.location.href = result.d;
        else
          showPopup(result);
      },
      failure: function(response) {
        alert(response.d);
      }
    });
  });
};

function calc(inputs) {

  //get all of the various input typs from the rows
  //each will be any array of elements
  var Quantitys = $('.row-qty');
  var UnitPrices = $('.row-unitprice');
  var Amounts = $('.row-amount');

  $.each($(".items_table .item-row"), function(i, value) {

    // get all the elements for the current row
    var Quantity = $(this).find('.row-qty');
    var UnitPrice = $(this).find('.row-unitprice');
    var Amount = $(this).find('.row-amount');

    ////// get the needed values from this row
    var qty = Quantity.val();
    qty = qty == '' ? 0 : qty; // if blank default to 0
    Quantity.val(qty); // set the value back, in case we had to remove soemthing
    var price = UnitPrice.val();
    price = price == '' ? 0 : Number(price); // if blank default to 0
    UnitPrice.val(price); // set the value back, in case we had to remove soemthing

    // get/set row tax and total
    // also add to our totals for later
    var rowPrice = price * 1000 * qty;
    var total = rowPrice;

    Amount.val((total / 1000).toFixed(2));

  });

}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
  <thead>
    <tr>
      <th>Action</th>
      <th>Description</th>
      <th>Qty</th>
      <th>Unit Price</th>
      <th>Amount</th>
      <th>Tax</th>
    </tr>
  </thead>
  <tbody class="items_table">
    <tr class="item-row">
      <td><button id="delete" href="javascript:;" onclick="deleteRow(this)" title="Remove row">Delete</button></td>
      <td><input class="form-control row-desc" id="desc" rows="1"></td>
      <td><input class="form-control tx-right row-qty" type="text" id="qty" onkeyup="calc()" value="0"></td>
      <td><input class="form-control tx-right row-unitprice" type="text" id="unitprice" value="0"></td>
      <td><input class="form-control tx-right row-amount" type="text" id="amount" disabled></td>
      <td>
        <input class="form-control tx-right row-tax" type="text" id="amounttax"></td>
    </tr>

  </tbody>
  <tr id="hiderow">
    <td colspan="7" class="tx-center tx-15"><b><a id="addrow" href="javascript:;" title="Add a row"><i class="fe fe-plus-circle"></i>Add an Item</a></b></td>
  </tr>
</table>
<br><br>
<button id="btnAddItem">Create Array</button>
Frenchy
  • 16,386
  • 3
  • 16
  • 39