本教程详细阐述了如何通过优化HTML结构和JavaScript事件处理,实现单选按钮(radio button)组的联动效果,即当一个单选按钮被选中时,其关联的文本输入框被启用,而其他单选按钮关联的输入框则被禁用。文章提供了清晰的HTML重构方案、高效的事件委托机制及完整的代码示例,旨在提升表单交互的用户体验和数据录入的准确性。
在构建交互式表单时,我们经常需要根据用户的选择动态调整表单元素的可用性。一个常见场景是,当用户选择某个单选按钮时,与其相关的输入框应被启用以供输入,而其他不相关的输入框则应被禁用。本教程将指导您如何使用纯JavaScript实现这一功能,并优化HTML结构以提高可维护性。
首先,为了实现单选按钮的正确联动行为,我们需要对HTML结构进行优化。关键在于为同一组的单选按钮设置相同的name属性,确保它们是互斥的。同时,为了更好地管理关联的输入框,我们建议将每个数字输入框嵌套在其对应的label元素中。
以下是优化后的HTML结构示例:
年龄:
关键改进点:
为了实现动态启用和禁用输入框的功能,我们将使用事件委托机制,监听document上的change事件。这种方法效率更高,因为它只需要一个事件监听器来处理所有相关的单选按钮。
document.addEventListener('change', e => {
// 检查触发事件的元素是否是我们的单选按钮组
if (e.target.name === 'age_unit') {
const parentContainer = e.target.parentNode.parentNode; // 获取最外层div
const selectedUnit = e.target.value; // 获取当前选中的值 (years 或 months)
// 找到当前选中的单选按钮对应的数字输入框
const selfInput = parentContainer.querySelector(`input[type='number'][name='age[${selectedUnit}]']`);
// 找到所有非当前选中的数字输入框
const otherInputs = parentContainer.querySelectorAll(`input[type='number']:not([name='age[${selectedUnit}]'])`);
// 启用当前选中的输入框
if (selfInput) {
selfInput.disabled = false;
selfInput.required = true; // 设置为必填
selfInput.focus(); // 自动获取焦点
}
// 禁用其他输入框
otherInputs.forEach(input => {
input.disabled = true;
input.required = false; // 移除必填属性
input.value = ''; // 清空值
});
}
});代码解析:
为了使数字输入框在视觉上更统一,可以添加简单的CSS样式:
[type='number']{
width:70px; /* 设置宽度 */
}通过上述HTML结构优化和JavaScript事件处理,您将能够构建一个响应迅速、用户友好的表单,根据单选按钮的选择动态控制相关输入框的可用性。这种模式不仅适用于年龄输入,也可推广到其他需要联动控制的表单场景。