You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何动态设置表单输入框required属性 仅展示的输入项设为必填

问题原因

浏览器原生表单校验规则会校验所有携带required属性的输入项,哪怕元素被设置为display: none隐藏也不会跳过校验,这是表单提交失败的核心原因。另外你提供的HTML代码存在结构错误:三个条件展示的div是逐层嵌套的状态,也会导致显隐逻辑异常,需要先修正为平级结构。

修复方案

1. 修正HTML结构

将三个条件展示区块调整为平级,输入项默认保留required属性即可:

<div class="select">
  <select onchange="yesnoCheck(this);" name="school_role" required>
    <option value="">--------</option>
    <option value="1">学生</option>
    <option value="2">教研人员</option>
    <option value="3">职工</option>
  </select>
</div>

<div id="ifStudent" style="display: none;">
  <label class="label">学号</label>
  <input class="input" type="text" name="account_number" value="{{ studentform.account_number.value }}" placeholder="请输入学号" required>
  <div class="help is-danger">
    {% for error in studentForm.account_number.errors %}{{ error }}{% endfor %}
  </div>
</div>

<div id="ifWorker" style="display: none;">
  <label class="label">职工号</label>
  <input class="input" type="text" name="employee_number" value="{{ employeeForm.employee_number.value }}" placeholder="请输入职工号" required>
  <div class="help is-danger">
    {% for error in employeeForm.employee_number.errors %}{{ error }}{% endfor %}
  </div>
</div>

<div id="ifAcademic" style="display: none;">
  <label class="label">教研人员编号</label>
  <input class="input" type="text" name="academic_number" value="{{ academicForm.academic_number.value }}" placeholder="请输入教研人员编号" required>
  <div class="help is-danger">
    {% for error in academicForm.academic_number.errors %}{{ error }}{% endfor %}
  </div>
</div>

2. 修改JS逻辑,动态控制required属性

切换选项显隐对应区块的同时,同步修改对应输入项的required属性,隐藏的输入项直接移除必填校验:

function yesnoCheck(that) {
  // 预获取所有关联元素
  const studentBlock = document.getElementById("ifStudent");
  const academicBlock = document.getElementById("ifAcademic");
  const workerBlock = document.getElementById("ifWorker");
  const studentInput = studentBlock.querySelector('input');
  const academicInput = academicBlock.querySelector('input');
  const workerInput = workerBlock.querySelector('input');

  // 处理学生选项
  if (that.value == "1") {
    studentBlock.style.display = "block";
    studentInput.required = true;
  } else {
    studentBlock.style.display = "none";
    studentInput.required = false;
  }

  // 处理教研人员选项
  if (that.value == "2") {
    academicBlock.style.display = "block";
    academicInput.required = true;
  } else {
    academicBlock.style.display = "none";
    academicInput.required = false;
  }

  // 处理职工选项
  if (that.value == "3") {
    workerBlock.style.display = "block";
    workerInput.required = true;
  } else {
    workerBlock.style.display = "none";
    workerInput.required = false;
  }
}

补充说明

如果页面初始化时下拉框有默认选中值,需要在页面加载完成后主动调用一次yesnoCheck函数,避免初始状态下的必填校验规则不匹配:

// 页面加载完成后执行
window.onload = function() {
  const roleSelect = document.querySelector('select[name="school_role"]');
  yesnoCheck(roleSelect);
}

另外后端做表单校验时,也需要根据提交的school_role字段值,只校验对应身份的输入字段即可。

内容的提问来源于stack exchange,提问作者Lely22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:09:03