Kyle Underhill
Kyle Underhill

Reputation: 109

jQuery - Using .each() inside of a function

I'm trying to set up a function that calculates the total when two inputs are changed within an .item. I want this to happen for the inputs on each .item only, but currently the way I have set up my calculateTotal() function does not run for each .item on keyup

function calculateTotal() {
  $(".item").each(function() {
    var item = $(this);
    var qty = item.find(".qty").val();
    var price = item.find(".cost").val();
    var total = Number(qty) * Number(price);
    $(".totalprice").text(total);
  });
}
calculateTotal();
$(".input--item").keyup(function() {
  calculateTotal();
});
.item {
  display: flex;
  align-items: center;
}

.wrap {
  border: 2px solid #eee;
  display: flex;
  flex-direction: column
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="item">
  <div class="wrap">
    Cost:
    <div class="edit">
      <input class="input--item qty" type="text" name="name" autocomplete="off" value="12" maxlength="3" />
    </div>
    Price:
    <div class="edit">
      <input class="input--item cost" type="text" name="name" autocomplete="off" value="55" maxlength="4" />
    </div>
  </div>
  <span class="totalprice"></span><br>
</div>
<div class="item">
  <div class="wrap">
    Cost:
    <div class="edit">
      <input class="input--item qty" type="text" name="name" autocomplete="off" value="40" />
    </div>
    Price:
    <div class="edit">
      <input class="input--item cost" type="text" name="name" autocomplete="off" value="79" />
    </div>
  </div>
  <span class="totalprice"></span><br>
</div>

Upvotes: 0

Views: 36

Answers (2)

Rubix&#39;s Mind
Rubix&#39;s Mind

Reputation: 74

Use item.find(".totalprice").text(total)

function calculateTotal() {
  $(".item").each(function() {
    var item = $(this);
    var qty = item.find(".qty").val();
    var price = item.find(".cost").val();
    var total = Number(qty) * Number(price);
    item.find(".totalprice").text(total)
    
  });
}
calculateTotal();
$(document).keyup('.input--item',function() {
  calculateTotal();
});
.item {
  display: flex;
  align-items: center;
}

.wrap {
  border: 2px solid #eee;
  display: flex;
  flex-direction: column
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.2/jquery.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="item">
  <div class="wrap">
    Cost:
    <div class="edit">
      <input class="input--item qty" type="text" name="name" autocomplete="off" value="12" maxlength="3" />
    </div>
    Price:
    <div class="edit">
      <input class="input--item cost" type="text" name="name" autocomplete="off" value="55" maxlength="4" />
    </div>
  </div>
 <span class="totalprice"></span><br>
</div>
<div class="item">
  <div class="wrap">
    Cost:
    <div class="edit">
      <input class="input--item qty" type="text" name="name" autocomplete="off" value="40" />
    </div>
    Price:
    <div class="edit">
      <input class="input--item cost" type="text" name="name" autocomplete="off" value="79" />
    </div>
  </div>
  <span class="totalprice"></span><br>
</div>

Upvotes: 1

Shridhar Sharma
Shridhar Sharma

Reputation: 2387

Here you are changing text of all the divs, instead you have to change the div for the current item, do it like this

function calculateTotal() {
  $(".item").each(function() {
    var item = $(this);
    var qty = item.find(".qty").val();
    var price = item.find(".cost").val();
    var total = Number(qty) * Number(price);
    $(this).find(".totalprice").text(total);
  });
}

calculateTotal();
$(".input--item").on("input",function() {
  calculateTotal();
});
.item {
  display: flex;
  align-items: center;
}

.wrap {
  border: 2px solid #eee;
  display: flex;
  flex-direction: column
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="item">
  <div class="wrap">
    Cost:
    <div class="edit">
      <input class="input--item qty" type="text" name="name" autocomplete="off" value="12" maxlength="3" />
    </div>
    Price:
    <div class="edit">
      <input class="input--item cost" type="text" name="name" autocomplete="off" value="55" maxlength="4" />
    </div>
  </div>
  <span class="totalprice"></span><br>
</div>
<div class="item">
  <div class="wrap">
    Cost:
    <div class="edit">
      <input class="input--item qty" type="text" name="name" autocomplete="off" value="40" />
    </div>
    Price:
    <div class="edit">
      <input class="input--item cost" type="text" name="name" autocomplete="off" value="79" />
    </div>
  </div>
  <span class="totalprice"></span><br>
</div>

Upvotes: 0

Related Questions