javascript - JavaScript 重构未按预期工作
问题描述
我有这段重复的代码可以切换我的 2 单选按钮$(document).ready()
:
$(document).ready(function () {
$("#New").click(function () {
var toggleOn = $("#New");
var toggleOff = $("#Used");
var value = true;
toggleOn.prop("checked", value);
toggleOn.val(value);
toggleOff.prop("checked", !value);
toggleOff.val(!value);
});
$("#Used").click(function () {
var toggleOn = $("#Used");
var toggleOff = $("#New");
var value = true;
toggleOn.prop("checked", value);
toggleOn.val(value);
toggleOff.prop("checked", !value);
toggleOff.val(!value);
});
});
我不想重复代码,所以我将它重构为一个函数:
$(document).ready(function () {
$("#Used").on("click", toggleRadioButtons("Used", "New"));
$("#New").on("click", toggleRadioButtons("New", "Used"));
});
function toggleRadioButtons(radioOne, radioTwo) {
var toggleOn = $("#" + radioOne);
var toggleOff = $("#" + radioTwo);
var value = true;
toggleOn.prop("checked", value);
toggleOn.val(value);
toggleOff.prop("checked", !value);
toggleOff.val(!value);
}
所以问题是,使用重构的代码,单选按钮不再正确地取消选中另一个单选按钮。我假设它与 JavaScript 闭包有关,但我不确定这将如何应用,因为我在它的外部范围内调用了一个函数。
解决方案
如果您将两个单选按钮设置为相同name
,则一次只能选择一个。
根本不需要 jQuery。
form {
display: grid;
grid-auto-flow: column;
justify-content: center;
grid-column-gap: 2em;
}
<form name="car">
<label>New <input type="radio" name="condition" value="new" /></label>
<label>Used <input type="radio" name="condition" value="used" /></label>
</form>
如果您希望它们成为复选框,您可以将它们与 jQuery 插件链接。我打电话给它syncCheckboxes
,代码可以在下面找到。
(function($) {
$.syncCheckboxes = function(...ids) {
const $checkboxes = ids.map(id => $(id));
$checkboxes.forEach(function($checkbox) {
$checkbox.on('click', function(e) {
if ($(this).prop('checked')) {
$checkboxes.forEach(function($curr) {
$curr.prop('checked', $curr === $checkbox);
});
}
})
});
};
})(jQuery);
$.syncCheckboxes('#New', '#Used');
form {
display: grid;
grid-auto-flow: column;
justify-content: center;
grid-column-gap: 2em;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form name="car">
<label>New <input type="checkbox" id="New" value="new" /></label>
<label>Used <input type="checkbox" id="Used" value="used" /></label>
</form>
推荐阅读
- python - PyCharm 中缺少 R 解释器
- javascript - 如何使用javascript以所有六种可能的方式将三个数字除以另外三个数字
- c# - 否定浮点变量的不同方法生成不同的程序集
- c# - c# 检查列表是否包含空元素并且不在 for 语句中列出整行
- python - 从 numpy 数组创建数据框
- python - Python文件检查中断每个循环?
- excel - 如何在 VBA 中获取 Max() 值索引单元格位置?
- amazon-web-services - 有没有办法通过清单文件自动将数据从 S3 导入 Quicksight?
- javascript - 角度中的多线程类联合的ngfor
- class - 如何获取R中缺失值NA的类属性?