jquery - 限制最大值共 3 个选择
问题描述
我正在尝试构建一个票务系统,该系统最多允许从 3 个年龄组(2-12、12-18、18+)中选择最多 4 人(在这种情况下为孩子),这些年龄组显示在 3 个不同的选择框中:
<div class="selects">
<div class="select-one select-box">
<label>Kids Ages 2-12</label>
<select id="kids1">
<option value="0">--select--</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
</div>
<div class="select-two select-box">
<label>Kids Ages 12-18</label>
<select id="kids2">
<option value="0">--select--</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
</div>
<div class="select-three select-box">
<label>Kids Ages 18+</label>
<select id="kids3">
<option value="0">--select--</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
<div class="error-box">
</div>
</div>
</div>
每个框最初有 4 个选项,但随着过程的进行,我自然想限制选择:如果在某个选择框中选择了 2 个孩子,那么在接下来的 2 个选择框中,你不能选择超过 2 个孩子,等等
在第一个选择框中选择“1”后,我开始尝试禁用第二个和第三个选择框中的选项:
$("#kids1").change(function() {
var kidsOne = $(this).val();
if (kidsOne === "1") {
$("#kids2").children('option:gt(3)').prop('disabled', true);
$("#kids3").children('option:gt(3)').prop('disabled', true);
} else {
$("#kids2").children('option:gt(1)').prop('disabled', false);
$("#kids3").children('option:gt(1)').prop('disabled', false);
}
}).change();
但后来我明白,当我进入下一个盒子时,这将是地狱。所以我认为最好的方法是设置所有值的最大值,并以此设置限制。但我不确定如何。
编辑:
我已将选择更改为输入数字,并尝试根据其他输入值和最大 4 限制每个更改的输入:
HTML:
<label>Kids Ages 2-12</label> <input class="qty" type="number" value="0" min="0" max="4" id="kids1"><br>
<label>Kids Ages 12-18</label> <input class="qty" type="number" value="0" min="0" max="4" id="kids2"><br>
<label>Kids Ages 18+</label> <input class="qty" type="number" value="0" min="0" max="4" id="kids3"><br>
jQuery:
$(document).on("change", ".qty", function() {
var sum = 0;
$(".qty").each(function() {
sum += +$(this).val();
});
var thisSum = $(this).val();
var sumOthers = parseInt(sum) - (thisSum);
var limitMax = parseInt(4) - (sumOthers);
$(this).attr("max", limitMax);
});
它基本上可以工作,问题是即使其他输入仍然总计为 4,它仍然允许第一个增量。有什么想法吗?
解决方案
下面的代码是一个好的开始。目前它只能通过重置其他人从第一个到最后一个选择/输入。
var total = 0;
var max = 4;
$('#total span').html(total);
$('#kids1').on('change', function() {
var kids1 = parseInt($(this).val());
let allowed = max - kids1;
$('#kids2').val(0).attr('max', allowed);
$('#kids3').val(0).attr('max', allowed);
total = kids1;
$('#total span').html(total);
});
$('#kids2').on('change', function() {
var kids1 = parseInt($('#kids1').val());
var kids2 = parseInt($(this).val());
let allowed = max - (kids1 + kids2)
$('#kids3').val(0).attr('max', allowed);
total = kids1 + kids2
$('#total span').html(total);
});
label {
width: 125px;
display: inline-block;
}
input {
padding: 3px;
}
#total {
margin-top: 5px;
padding-top: 5px;
border-top: 1px solid #bbb;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<label>Kids Ages 2-12</label> <input type="number" value="0" min="0" max="4" id="kids1"><br>
<label>Kids Ages 12-18</label> <input type="number" value="0" min="0" max="4" id="kids2"><br>
<label>Kids Ages 18+</label> <input type="number" value="0" min="0" max="4" id="kids3"><br>
<div id="total">
Total: <span></span>
</div>
推荐阅读
- botframework - 当团队调用但响应为 501 时,handleTeamsSigninVerifyState 被击中
- c# - 理解 Unity 中的四元数
- bash - Mac Bash shell 如何在单独的窗口中显示编辑器
- ssl - *.herokuapp.com 通配符证书到期
- java - 如何向 JComponent 添加多个矩形?
- javascript - 为什么在 vuejs 中将数据插入表时我的提交按钮不起作用
- javascript - 如何获取没有双引号的 Jade 文件
- javascript - 如何在 Sequelize Js 中更改数据库迁移顺序
- blockchain - 如何使用 web3 获取以太坊区块的数据
- mysql - CASE WHEN "__" LIKE "__" ELSE "__" MySQL 错误