How to make a click function in javascript loop through all records instead of just the first record

Viewed 70

I have a feeling this problem I've having trouble with is pretty simple but I am new to all this and don't know all the ins and outs of html, javascript, etc. yet. The javascript functions is what's really difficult to learn for me. Anyways, I have an item cart where the users add whatever products they want to order. I'm trying to implement a function where when the user clicks the "Proceed To Checkout" button it checks to make sure whatever qty they are ordering does not exceed the amount we have in stock. If it does then display an alert message. I have a function working perfectly at the moment, but it is only checking the first record and not looping through anything. Any thoughts or insight on what I can do would be greatly appreciated. Here is my code:

   @foreach (var item in (List<Item>)Session["cart"])
    {
        <tr>
          <td>
            @item.Pr.Product_Code
          </td>
          <td>
            @item.Pr.Description<br />
            <span class="text-left" id="errmsg"></span>
          </td>
          <td>
            <img src="~/Images/@item.Pr.ImageUrl" width="100" height="80" />
          </td>
          <td>
            <input type="text" value="@item.Qty" id="quantity" name="quantity" class="amtOrdered" /><br />
            <input type="text" value="@item.Pr.Qty_Available" id="qty-avbl" name="qty-avbl" class="amt-avbl" hidden />
          </td>
          <td class="btn-sctn">
            <button class="button">
               <i class="fa solid fa-trash-o"></i>
               @Html.ActionLink("Remove", "Delete", "ItemCart", new { id = item.Pr.ProductID },
                           new { onclick = "return confirm ('Are you sure you want to delete this item?');", @class = "remove" })
            </button>
            </td>
            <td></td>
         </tr>
      }
    </table>
         <div></div>
         <hr />
         <p class="place-order">
            <input type="submit" class="checkout" value="Proceed To Checkout" id="checkQty" />
         </p>
         <p class="keep-shop">
            @Html.ActionLink("Continue Shopping", "ProductCatalog", "Products", "", new { @class = "shopping-link" })
         </p>
      }@*End of form*@
    }@*End of if session*@

and my function I have for this is:

<script type="text/javascript">
    $(document).ready(function () {
        $("#checkQty").click(function (event) {
            // Get the value of the input field with id
            let qty = document.getElementById("quantity").value;
            let avbl = document.getElementById("qty-avbl").value;
            let text;
                if (qty > avbl) {
                    event.preventDefault();
                    text = "There is not enough stock to order this amount";
                    document.getElementById("errmsg").innerHTML = text;
                    return false;
                }
                else {
                    text = "";
                }           
        });
    });
</script>
1 Answers

Try this, I hope it will solve your problem based on what you described.

<script type="text/javascript">
$(document).ready(function () {
    $("#checkQty").click(function (event) {
        // Get the value of the input field with id
        let qtys = document.querySelectorAll('input[name="quantity"]');
        let avbls = document.querySelectorAll('input[name="qty-avbl"]');
        let text;
        
        // assumming the quantity and available quantity inputs will be adjacent and equal in number
        for(let i=0; i < qtys.length; i++){
            let qty = qtys[i].value;
            let avbl = avbls[i].value;

            if (qty > avbl) {
                event.preventDefault();
                text = "There is not enough stock to order this amount";
                document.getElementById("errmsg").innerHTML = text;
                return false;
            }
            else {
                text = "";
            }     
        }
  
    });
});

Here you can use for-of or foreach loop as well to iterate over all the inputs.

Related