Рассмотрим следующий код.
$(function() {
function calcCatTotal(inp) {
var cat = $(inp).parents(".category");
var total = 0;
var mult = 0;
$("input.value:checked", cat).not(".mtl").each(function(ind, el) {
total += parseInt($(inp).val());
});
if ($(".mlt", cat).is(":checked")) {
mult = parseInt($(".pages", cat).val()) * 100;
}
total = total + mult;
$(".sub", cat).val(total);
calcFullTotal();
}
function calcFullTotal() {
var total = 0;
$(".sub").each(function() {
total += parseInt($(this).val());
});
$(".total").val(total);
}
$("input").change(function() {
if ($(this).hasClass("mlt")) {
$(this).siblings(".pages").prop("disabled", !$(this).is(":checked"));
} else {
calcCatTotal(this);
}
});
});
.category ul {
padding: 0;
margin: 0;
list-style: none;
}
.category ul li {
margin-left: 1em;
}
.category ul li label {
margin: 3px;
}
.category ul li input {
margin-right: 3px;
border: 1px solid #ccc;
border-radius: 3px;
}
.category ul li input[type='text'] {
width: 4em;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form action="">
<div class="category group-a">
[Group-A]
<ul>
<li><input type="checkbox" class="value" value="100"><label>100</label></li>
<li><input type="checkbox" class="value" value="200"><label>200</label></li>
<li><input type="checkbox" class="value" value="300"><label>300</label></li>
<li><input type="checkbox" class="mlt" value="0"><label>Multiple pages: 100 × </label><input value="" disabled="true" type="text" class="pages"><label>pages</label></li>
</ul>
<label>[Subtotal]</label><input type="text" class="sub" value="0">
</div>
<div class="category group-b">
[Group-B]
<ul>
<li><input type="radio" name="group-b" class="value" value="100"><label>100</label></li>
<li><input type="radio" name="group-b" class="value" value="200"><label>200</label></li>
<li><input type="radio" name="group-b" class="value" value="300"><label>300</label></li>
<li><input type="checkbox" class="value mlt" value="200"><label>multiple pages: 200 x</label><input value="" type="text" disabled="true" class="pages"><label>pages</label></li>
</ul>
<label>[Subtotal]</label><input type="text" class="sub" value="0">
</div>
Total:<input type="text" class="total" value="0">
</form>
Если мы разбиваем операции на их собственные функции, мы можем немного проще назначить их в обратных вызовах.Это допускает много разных вариантов, но мы все еще выполняем очень похожие задачи.
Надеюсь, это поможет.