The explanation is below the code:
The code for HTML is :
Add-ons
I believe that you're simply missing a block for your if statement in the each function: you don't want to increment total unless this.checked is true. Furthermore, you want to convert all strings to numbers so that you don't get string concatenation from + - I've used parseInt. Also, from your description, it seems like you only want to add the value from the option once, not each time through the loop, so use that to initialize total:
$cbs.click(function()
{
var total = parseInt($("#more").val());
$cbs.each(function()
{
if (this.checked)
total += parseInt(this.value);
});
$("#usertotal").text(total);
});
But you also want to do this calculation and update when the select changes, so you should pull this loop out into a separate function and call it using click:
function calculateTotal()
{
var total = parseInt($("#more").val());
$cbs.each(function()
{
if (this.checked)
total += parseInt(this.value);
});
$("#usertotal").text(total);
}
$("#more").change(calculateTotal);
$cbs.click(calculateTotal);
Try this
$("select").change(function() {
$('input[name="ch1"]').change(); // trigger change to recalculate
});
$('input[name="ch1"]').change(function() {
var singleValues = 0;
$('input[name="ch1"]:checked').each(function() { // loop through checked inputs
singleValues = +this.value + singleValues;
});
singleValues += (+$('#more').val().replace('QR', '').trim()); // add drop down to checked inputs
$("#usertotal").text(singleValues);
});
http://jsfiddle.net/wirey00/5s8qr/
I have done complete bins for above query. here is demo link as well.
Demo: http://codebins.com/bin/4ldqp85
HTML
<div id="container">
<h1>
Add-ons
</h1>
<input type="checkbox" name="ch1" value="10" id="qr1" />
Add-on Number 1 - 10 QR
<br />
<input type="checkbox" name="ch1" value="20" id="qr1" />
Add-on Number 2 - 20 QR
<br />
<input type="checkbox" name="ch1" value="40" id="qr1" />
Add-on Number 3 - 40 QR
<br />
<input type="checkbox" name="ch1" value="60" id="qr1" />
Add-on Number 4 - 60 QR
<br />
</div>
<div>
I want more add-ons
<select id="more" name="more">
<option value="0 QR">
0
</option>
<option value="30 QR">
1
</option>
<option value="50 QR">
2
</option>
<option value="100 QR">
3
</option>
</select>
<span id="span">
</span>
User total usage:
<span id="usertotal">
</span>
</div>
JQuery
$(function() {
$('input[name="ch1"]:checkbox').change(function() {
var total = 0;
$('input[name="ch1"]:checked').each(function() {
total += parseInt($(this).val());
});
total += parseInt($('#more').val());
$('#usertotal').html(total);
});
$('#more').change(function() {
var selectVal = $(this).val().trim();
if (parseInt(selectVal) > 0) {
$("#span").html("<b>more addons:</b> " + selectVal);
} else {
$("#span").html("");
}
$('input[name="ch1"]:checkbox').trigger('change');
});
});
Demo: http://codebins.com/bin/4ldqp85
Here is your answer
Working Demo
$('input:checkbox').change(function(){
var tot=0;
$('input:checkbox:checked').each(function(){
tot+=parseInt($(this).val());
});
tot+=parseInt($('#more').val());
$('#usertotal').html(tot)
});
$('#more').change(function(){
$('input:checkbox').trigger('change');
});
JsFiddle
HTML:
<div id="container"><h1>Add-ons</h1>
<input type="checkbox" name="ch1" value="10" id="qr1" />Add-on Number 1 - 10 QR <br />
<input type="checkbox" name="ch1" value="20" id="qr1" />Add-on Number 2 - 20 QR <br />
<input type="checkbox" name="ch1" value="40" id="qr1" />Add-on Number 3 - 40 QR <br />
<input type="checkbox" name="ch1" value="60" id="qr1" />Add-on Number 4 - 60 QR <br />
</div>
<div> I want more add-ons
<select id="more" name="more">
<option value="0">0</option>
<option value="30">1</option>
<option value="50">2</option>
<option value="100">3</option>
</select>
<span id="span"></span>
User total usage: <span id="usertotal"> </span>
Javascript:
function displayVals() {
calcUsage();
var singleValues = $("#more").val();
$("#span").html("<b>more addons:</b> " +
singleValues + ' QR');
}
var $cbs = $('input[name="ch1"]');
function calcUsage() {
var total = $("#more").val();
$cbs.each(function() {
if (this.checked)
total = parseInt(total) + parseInt(this.value);
});
$("#usertotal").text(total + ' QR');
}
$("select").change(displayVals);
displayVals();
//For checkboxes
$cbs.click(calcUsage);
I've created a fiddle for your code.
Hope this is what you wanted.
HTML:
<div id="container"><h1>Add-ons</h1>
<input type="checkbox" name="ch1" value="10" id="qr1" />Add-on Number 1 - 10 QR <br />
<input type="checkbox" name="ch1" value="20" id="qr1" />Add-on Number 2 - 20 QR <br />
<input type="checkbox" name="ch1" value="40" id="qr1" />Add-on Number 3 - 40 QR <br />
<input type="checkbox" name="ch1" value="60" id="qr1" />Add-on Number 4 - 60 QR <br />
</div>
<div> I want more add-ons
<select id="more" name="more">
<option value="0">0</option>
<option value="30">1</option>
<option value="50">2</option>
<option value="100">3</option>
</select>
<span id="span"></span>
User total usage: <span id="usertotal"> </span>
Javascript:
function displayVals() {
calcUsage();
var singleValues = $("#more").val();
$("#span").html("<b>more addons:</b> " +
singleValues + ' QR');
}
var $cbs = $('input[name="ch1"]');
function calcUsage() {
var total = $("#more").val();
$cbs.each(function() {
if (this.checked)
total = parseInt(total) + parseInt(this.value);
});
$("#usertotal").text(total + ' QR');
}
$("select").change(displayVals);
displayVals();
//For checkboxes
$cbs.click(calcUsage);