Jaydeep Gondaliya Jaydeep Gondaliya - 4 months ago 9
jQuery Question

Calculate total on checkbox checked

HTML

<div id="catlist">
<input type="checkbox" id="cat_1" value="cat_1" price="1.5" /><label for="cat_1">cat_1</label><br/>
<input type="checkbox" id="cat_2" value="cat_2" price="2" /><label for="cat_2">cat_2</label><br/>
<input type="checkbox" id="cat_3" value="cat_3" price="3.5" /><label for="cat_3">cat_3</label><br/>
<input type="checkbox" id="cat_4" value="cat_4" price="4" /><label for="cat_4">cat_4</label><br/>
<input type="checkbox" id="cat_5" value="cat_5" price="5" /><label for="cat_5">cat_5</label><br/>
<input type="checkbox" id="cat_6" value="cat_6" price="6.5" /><label for="cat_6">cat_6</label><br/>
<input type="checkbox" id="cat_7" value="cat_7" price="7" /><label for="cat_7">cat_7</label><br/>
<input type="checkbox" id="cat_8" value="cat_8" price="8" /><label for="cat_8">cat_8</label><br/>
<input type="checkbox" id="cat_9" value="cat_9" price="9.5" /><label for="cat_9">cat_9</label>
</div>
<input type="text" id="total" value="0" />


Javascript

function calcAndShowTotal(){
var total = 0;
$('#catlist :checkbox[checked]').each(function(){
total =+ parseFloat($(this).attr('price')) || 0;
});
$('#total').val(total);
}

$('#pricelist :checkbox').click(function(){
calcAndShowTotal();
});

calcAndShowTotal();


I am getting particular value. WHY? I tried sum of total, i tried jquery but no success..

Answer
  • Use $('#catlist :checkbox:checked') selector to select checked checkboxes
  • + operator is not needed before parseFloat, it has to be total =+
  • Instead of calling handler, just invoke change handler using .change()

function calcAndShowTotal() {
  var total = 0;
  $('#catlist :checkbox:checked').each(function() {
    total += parseFloat($(this).attr('price')) || 0;
  });
  $('#total').val(total);
}

$('#catlist :checkbox').change(calcAndShowTotal).change();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<div id="catlist">
  <input type="checkbox" id="cat_1" value="cat_1" price="1.5" />
  <label for="cat_1">cat_1</label>
  <br/>
  <input type="checkbox" id="cat_2" value="cat_2" price="2" />
  <label for="cat_2">cat_2</label>
  <br/>
  <input type="checkbox" id="cat_3" value="cat_3" price="3.5" />
  <label for="cat_3">cat_3</label>
  <br/>
  <input type="checkbox" id="cat_4" value="cat_4" price="4" />
  <label for="cat_4">cat_4</label>
  <br/>
  <input type="checkbox" id="cat_5" value="cat_5" price="5" />
  <label for="cat_5">cat_5</label>
  <br/>
  <input type="checkbox" id="cat_6" value="cat_6" price="6.5" />
  <label for="cat_6">cat_6</label>
  <br/>
  <input type="checkbox" id="cat_7" value="cat_7" price="7" />
  <label for="cat_7">cat_7</label>
  <br/>
  <input type="checkbox" id="cat_8" value="cat_8" price="8" />
  <label for="cat_8">cat_8</label>
  <br/>
  <input type="checkbox" id="cat_9" value="cat_9" price="9.5" />
  <label for="cat_9">cat_9</label>
</div>
<input type="text" id="total" value="0" />

Using Array#reduce

function calcAndShowTotal() {
  var total = [].reduce.call($('#catlist :checkbox:checked'), function(a, b) {
    return a + +$(b).attr('price') || 0;
  }, 0);
  $('#total').val(total);
}

$('#catlist :checkbox').change(calcAndShowTotal).change();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<div id="catlist">
  <input type="checkbox" id="cat_1" value="cat_1" price="1.5" />
  <label for="cat_1">cat_1</label>
  <br/>
  <input type="checkbox" id="cat_2" value="cat_2" price="2" />
  <label for="cat_2">cat_2</label>
  <br/>
  <input type="checkbox" id="cat_3" value="cat_3" price="3.5" />
  <label for="cat_3">cat_3</label>
  <br/>
  <input type="checkbox" id="cat_4" value="cat_4" price="4" />
  <label for="cat_4">cat_4</label>
  <br/>
  <input type="checkbox" id="cat_5" value="cat_5" price="5" />
  <label for="cat_5">cat_5</label>
  <br/>
  <input type="checkbox" id="cat_6" value="cat_6" price="6.5" />
  <label for="cat_6">cat_6</label>
  <br/>
  <input type="checkbox" id="cat_7" value="cat_7" price="7" />
  <label for="cat_7">cat_7</label>
  <br/>
  <input type="checkbox" id="cat_8" value="cat_8" price="8" />
  <label for="cat_8">cat_8</label>
  <br/>
  <input type="checkbox" id="cat_9" value="cat_9" price="9.5" />
  <label for="cat_9">cat_9</label>
</div>
<input type="text" id="total" value="0" />