jQuery - 将表单中的值乘以复选框值给出的(预定义)因子
jQuery - Multiply the value in the form with (predefined) factors given by checkbox values
我有一个字符串,它是这样的组合序列:"AB BCD C AD ABCD..."。
A、B、C 和 D 是因数,比方说 2、3、4 和 5。
我需要计算值 total
,它是初始值(下面 html 示例中的 10 或 20)与这些因素的乘积。
因素的组合应由用户通过选中相应的框来 select 编辑,但它们 select 的组合应包含在上面的字符串中。如果没有,用户应该可以从下拉菜单中选择 select 允许的组合。后一个动作应自动选中相应的框,从而计算出 total
.
所需的值
我需要在表单中重复多次,但我卡在了从 html 属性 "value" 中读取 total
的不同初始值的阶段。当前版本忽略了这一点,因为我在 jQuery.
中设置了 total = 10
$(document).ready(function() {
$(".factor-checkbox").click(function(event) {
var $section = $(this).closest(".section"),
total = 10;
$section.find("input:checked").each(function() {
total *= parseInt($(this).val());
});
$section.find('.result').val(total);
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="section">
<label><input type="checkbox" name="A" value="2" class="factor-checkbox">A</label>
<label><input type="checkbox" name="B" value="3" class="factor-checkbox">B</label>
<label><input type="checkbox" name="C" value="4" class="factor-checkbox">C</label>
<label><input type="checkbox" name="D" value="5" class="factor-checkbox">D</label>
<label>Result <input type="text" value="10" class="result"></label>
</div>
<div class="section">
<label><input type="checkbox" name="A" value="2" class="factor-checkbox">A</label>
<label><input type="checkbox" name="B" value="3" class="factor-checkbox">B</label>
<label><input type="checkbox" name="C" value="4" class="factor-checkbox">C</label>
<label><input type="checkbox" name="D" value="5" class="factor-checkbox">D</label>
<label>Result <input type="text" value="20" class="result"></label>
</div>
这是我的方法
$(document).ready(function() {
$(".factor-checkbox").click(function(event) {
var $section = $(this).closest(".section");
if ($section.find("input:checked").length>0)
{
total = $section.find('.result').val();
initial = total;
$section.find("input:checked").each(function() {
total *= parseInt($(this).val());
});
$section.find('.result').val(total);
}else {
total = $section.find('.result').val(initial);
}
});
});
input.initial{
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="section">
<label><input type="checkbox" name="A" value="2" class="factor-checkbox">A</label>
<label><input type="checkbox" name="B" value="3" class="factor-checkbox">B</label>
<label><input type="checkbox" name="C" value="4" class="factor-checkbox">C</label>
<label><input type="checkbox" name="D" value="5" class="factor-checkbox">D</label>
<label>Result <input type="text" value="10" class="result">
</label>
</div>
<div class="section">
<label><input type="checkbox" name="A" value="2" class="factor-checkbox">A</label>
<label><input type="checkbox" name="B" value="3" class="factor-checkbox">B</label>
<label><input type="checkbox" name="C" value="4" class="factor-checkbox">C</label>
<label><input type="checkbox" name="D" value="5" class="factor-checkbox">D</label>
<label>Result <input type="text" value="20" class="result">
</label>
</div>
HTML
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="section">
<label><input type="checkbox" name="A" value="2" class="factor-checkbox">A</label>
<label><input type="checkbox" name="B" value="3" class="factor-checkbox">B</label>
<label><input type="checkbox" name="C" value="4" class="factor-checkbox">C</label>
<label><input type="checkbox" name="D" value="5" class="factor-checkbox">D</label>
<!-- select box with available combinations (can be baked through JS) -->
<select style="display:none" class='helperBox'>
<option val=''>Available Combos</option>
<option val='AB'>AB</option>
<option val='BCD'>BCD</option>
<option val='C'>C</option>
<option val='AD'>AD</option>
<option val='ABCD'>ABCD</option>
</select>
<label>Result <input type="text" value="10" class="result"></label>
</div>
<div class="section">
<label><input type="checkbox" name="A" value="2" class="factor-checkbox">A</label>
<label><input type="checkbox" name="B" value="3" class="factor-checkbox">B</label>
<label><input type="checkbox" name="C" value="4" class="factor-checkbox">C</label>
<label><input type="checkbox" name="D" value="5" class="factor-checkbox">D</label>
<select style="display:none" class='helperBox'>
<option val=''>Available Combos</option>
<option val='AB'>AB</option>
<option val='BCD'>BCD</option>
<option val='C'>C</option>
<option val='AD'>AD</option>
<option val='ABCD'>ABCD</option>
</select>
<label>Result <input type="text" value="20" class="result"></label>
</div>
JavaScript
$(document).ready(function() {
// combo list
var combos = ['AB', 'BCD', 'C', 'AD', 'ABCD'];
$(".factor-checkbox").click(function(event) {
var $section = $(this).closest(".section");
var $total = $section.find('.result');
total = calculateTotal($section);
$total.val(total);
});
// combo selection box logic
$('.helperBox').change(function(){
var $section = $(this).closest(".section");
var $options = $section.find("input[type=checkbox]");
var selectedCombo = $(this).val(); // current selected value
var selectionArray = selectedCombo.split(''); // break current selected value into names
//iterate available options
$options.each(function(i,child){
// if name is present check it, else uncheck it
if($.inArray(child.name,selectionArray) > -1) {
$(child).prop('checked',true);
} else {
$(child).prop('checked',false);
}
})
// set new total and hide the combination select box
var $total = $section.find('.result');
total = calculateTotal($section);
$total.val(total);
$(this).hide();
});
function calculateTotal($section) {
var $total = $section.find('.result');
// get default value of input field
total = parseInt($total.attr('value'));
// if allowed calulate total, elseshow help selection
if(validateCombo($section) > -1) {
$section.find("input:checked").each(function() {
total *= parseInt($(this).val());
});
} else {
$section.find('.helperBox').show();
}
return total;
}
// check if selected combination is allowed, returns -1 if not allowed
function validateCombo(parent) {
var comboString = '';
parent.find('input[type=checkbox]').each(function(i,child){
if($(child).is(':checked'))
comboString += child.name;
});
return $.inArray(comboString,combos);
}
});
基本思路是检查所选组合是否被允许(组合 "AB BCD C AD ABCD..." 中存在)。如果选择中不存在该组合,我们需要向用户显示一个包含可用组合的选择框。
我有一个字符串,它是这样的组合序列:"AB BCD C AD ABCD..."。
A、B、C 和 D 是因数,比方说 2、3、4 和 5。
我需要计算值 total
,它是初始值(下面 html 示例中的 10 或 20)与这些因素的乘积。
因素的组合应由用户通过选中相应的框来 select 编辑,但它们 select 的组合应包含在上面的字符串中。如果没有,用户应该可以从下拉菜单中选择 select 允许的组合。后一个动作应自动选中相应的框,从而计算出 total
.
我需要在表单中重复多次,但我卡在了从 html 属性 "value" 中读取 total
的不同初始值的阶段。当前版本忽略了这一点,因为我在 jQuery.
total = 10
$(document).ready(function() {
$(".factor-checkbox").click(function(event) {
var $section = $(this).closest(".section"),
total = 10;
$section.find("input:checked").each(function() {
total *= parseInt($(this).val());
});
$section.find('.result').val(total);
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="section">
<label><input type="checkbox" name="A" value="2" class="factor-checkbox">A</label>
<label><input type="checkbox" name="B" value="3" class="factor-checkbox">B</label>
<label><input type="checkbox" name="C" value="4" class="factor-checkbox">C</label>
<label><input type="checkbox" name="D" value="5" class="factor-checkbox">D</label>
<label>Result <input type="text" value="10" class="result"></label>
</div>
<div class="section">
<label><input type="checkbox" name="A" value="2" class="factor-checkbox">A</label>
<label><input type="checkbox" name="B" value="3" class="factor-checkbox">B</label>
<label><input type="checkbox" name="C" value="4" class="factor-checkbox">C</label>
<label><input type="checkbox" name="D" value="5" class="factor-checkbox">D</label>
<label>Result <input type="text" value="20" class="result"></label>
</div>
这是我的方法
$(document).ready(function() {
$(".factor-checkbox").click(function(event) {
var $section = $(this).closest(".section");
if ($section.find("input:checked").length>0)
{
total = $section.find('.result').val();
initial = total;
$section.find("input:checked").each(function() {
total *= parseInt($(this).val());
});
$section.find('.result').val(total);
}else {
total = $section.find('.result').val(initial);
}
});
});
input.initial{
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="section">
<label><input type="checkbox" name="A" value="2" class="factor-checkbox">A</label>
<label><input type="checkbox" name="B" value="3" class="factor-checkbox">B</label>
<label><input type="checkbox" name="C" value="4" class="factor-checkbox">C</label>
<label><input type="checkbox" name="D" value="5" class="factor-checkbox">D</label>
<label>Result <input type="text" value="10" class="result">
</label>
</div>
<div class="section">
<label><input type="checkbox" name="A" value="2" class="factor-checkbox">A</label>
<label><input type="checkbox" name="B" value="3" class="factor-checkbox">B</label>
<label><input type="checkbox" name="C" value="4" class="factor-checkbox">C</label>
<label><input type="checkbox" name="D" value="5" class="factor-checkbox">D</label>
<label>Result <input type="text" value="20" class="result">
</label>
</div>
HTML
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="section">
<label><input type="checkbox" name="A" value="2" class="factor-checkbox">A</label>
<label><input type="checkbox" name="B" value="3" class="factor-checkbox">B</label>
<label><input type="checkbox" name="C" value="4" class="factor-checkbox">C</label>
<label><input type="checkbox" name="D" value="5" class="factor-checkbox">D</label>
<!-- select box with available combinations (can be baked through JS) -->
<select style="display:none" class='helperBox'>
<option val=''>Available Combos</option>
<option val='AB'>AB</option>
<option val='BCD'>BCD</option>
<option val='C'>C</option>
<option val='AD'>AD</option>
<option val='ABCD'>ABCD</option>
</select>
<label>Result <input type="text" value="10" class="result"></label>
</div>
<div class="section">
<label><input type="checkbox" name="A" value="2" class="factor-checkbox">A</label>
<label><input type="checkbox" name="B" value="3" class="factor-checkbox">B</label>
<label><input type="checkbox" name="C" value="4" class="factor-checkbox">C</label>
<label><input type="checkbox" name="D" value="5" class="factor-checkbox">D</label>
<select style="display:none" class='helperBox'>
<option val=''>Available Combos</option>
<option val='AB'>AB</option>
<option val='BCD'>BCD</option>
<option val='C'>C</option>
<option val='AD'>AD</option>
<option val='ABCD'>ABCD</option>
</select>
<label>Result <input type="text" value="20" class="result"></label>
</div>
JavaScript
$(document).ready(function() {
// combo list
var combos = ['AB', 'BCD', 'C', 'AD', 'ABCD'];
$(".factor-checkbox").click(function(event) {
var $section = $(this).closest(".section");
var $total = $section.find('.result');
total = calculateTotal($section);
$total.val(total);
});
// combo selection box logic
$('.helperBox').change(function(){
var $section = $(this).closest(".section");
var $options = $section.find("input[type=checkbox]");
var selectedCombo = $(this).val(); // current selected value
var selectionArray = selectedCombo.split(''); // break current selected value into names
//iterate available options
$options.each(function(i,child){
// if name is present check it, else uncheck it
if($.inArray(child.name,selectionArray) > -1) {
$(child).prop('checked',true);
} else {
$(child).prop('checked',false);
}
})
// set new total and hide the combination select box
var $total = $section.find('.result');
total = calculateTotal($section);
$total.val(total);
$(this).hide();
});
function calculateTotal($section) {
var $total = $section.find('.result');
// get default value of input field
total = parseInt($total.attr('value'));
// if allowed calulate total, elseshow help selection
if(validateCombo($section) > -1) {
$section.find("input:checked").each(function() {
total *= parseInt($(this).val());
});
} else {
$section.find('.helperBox').show();
}
return total;
}
// check if selected combination is allowed, returns -1 if not allowed
function validateCombo(parent) {
var comboString = '';
parent.find('input[type=checkbox]').each(function(i,child){
if($(child).is(':checked'))
comboString += child.name;
});
return $.inArray(comboString,combos);
}
});
基本思路是检查所选组合是否被允许(组合 "AB BCD C AD ABCD..." 中存在)。如果选择中不存在该组合,我们需要向用户显示一个包含可用组合的选择框。