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

JavaScript中表单验证通过后如何实现表单提交?

解决表单验证通过后无法提交的问题

你的代码里e.preventDefault()会无条件阻止表单提交,所以需要在所有验证通过时手动触发表单提交,以下是具体修改方案:

1. 让checkInputs返回验证状态

修改checkInputs函数,新增一个变量跟踪所有字段的验证结果,最后返回这个状态:

function checkInputs() {
  // trim 去除首尾空格
  const usernameValue = username.value.trim();
  const emailValue = email.value.trim();
  const passwordValue = password.value.trim();
  let isValid = true; // 标记是否所有字段验证通过

  if (usernameValue === '') {
    setErrorFor(username, 'Full name cannot be blank');
    isValid = false;
  } else {
    setSuccessFor(username);
  }

  if (emailValue === '') {
    setErrorFor(email, 'Email cannot be blank');
    isValid = false;
  } else if (!isEmail(emailValue)) {
    setErrorFor(email, 'Not a valid email');
    isValid = false;
  } else {
    setSuccessFor(email);
  }

  if (passwordValue === '') {
    setErrorFor(password, 'Roll number cannot be blank');
    isValid = false;
  } else if (passwordValue.length < 10) {
    setErrorFor(password, 'Roll number must be 10 digits');
    isValid = false;
  } else {
    setSuccessFor(password);
  }

  return isValid; // 返回最终验证结果
}

2. 根据验证结果决定是否提交表单

修改表单的submit事件监听逻辑,当验证通过时手动调用form.submit():

form.addEventListener('submit', e => {
  e.preventDefault();

  const isFormValid = checkInputs();
  if (isFormValid) {
    form.submit(); // 验证通过,手动提交表单
  }
});

可选优化:修复语义化问题

注意到你HTML里“Roll Number”对应的input id是password,这不符合语义化,建议修改为rollNumber,同时同步调整JavaScript代码:

HTML修改:

<div class="form-control">
  <label for="rollNumber">Roll Number</label>
  <input type="text" maxlength="10" placeholder="Roll Number" id="rollNumber" />
  <i class="fas fa-check-circle"></i>
  <i class="fas fa-exclamation-circle"></i>
  <small>Error message</small>
</div>

JavaScript修改:

const rollNumber = document.getElementById('rollNumber');

// 在checkInputs中替换相关逻辑:
const rollNumberValue = rollNumber.value.trim();

if (rollNumberValue === '') {
  setErrorFor(rollNumber, 'Roll number cannot be blank');
  isValid = false;
} else if (rollNumberValue.length < 10) {
  setErrorFor(rollNumber, 'Roll number must be 10 digits');
  isValid = false;
} else {
  setSuccessFor(rollNumber);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:45:32