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

如何在表单校验通过后绕过preventDefault完成表单提交

解决方案

你只需要让校验函数返回校验是否通过的布尔状态,校验通过时手动调用表单原生的submit()方法即可,手动调用submit()不会触发你绑定的submit事件监听器,不会出现重复拦截的死循环问题。

具体修改步骤

    1. 改造checkInputs、checkInputsLogin函数,新增校验状态返回值
      两个函数内部新增变量标记校验是否通过,只要出现任意字段校验失败就将标记设为false,最后返回这个标记值。
    1. 改造submit事件监听逻辑,校验通过时触发表单提交
      在事件回调中拿到校验函数的返回值,返回true时直接调用表单的submit()方法完成提交。

修改后的完整代码

// Script Validasi Form Daftar dan Masuk
const form = document.getElementById('formRegister');
const registerNama = document.getElementById('registerNama');
const registerEmail = document.getElementById('registerEmail');
const registerPassword = document.getElementById('registerPassword');
const registerPassword2 = document.getElementById('registerPassword2');

const formLogin = document.getElementById('formLogin');
const loginEmail = document.getElementById('loginEmail');
const loginPassword = document.getElementById('loginPassword');

form.addEventListener('submit', (e) => {
  e.preventDefault();
  // 校验通过则提交
  if(checkInputs()) {
    form.submit();
  }
});

formLogin.addEventListener('submit', (e) => {
  e.preventDefault();
  // 校验通过则提交
  if(checkInputsLogin()) {
    formLogin.submit();
  }
});

function checkInputs() {
  // 新增校验状态标记,默认通过
  let isValid = true;
  // Nangkep Value dar input
  const namaValue = registerNama.value; 
  const emailValue = registerEmail.value.trim();
  const passwordValue = registerPassword.value.trim();
  const password2Value = registerPassword2.value.trim();

  if(namaValue === '') {
    setErrorFor(registerNama, 'Masukkan nama anda');
    isValid = false;
  }else{
    setSuccessFor(registerNama);
  }

  if(emailValue === '') {
    setErrorFor(registerEmail, 'Masukkan email anda');
    isValid = false;
  }else{
    setSuccessFor(registerEmail);
  }

  if(passwordValue === '') {
    setErrorFor(registerPassword, 'Masukkan password anda');
    isValid = false;
  }else if(!isRegisterPassword(passwordValue)){
    setErrorFor(registerPassword, ' ');
    isValid = false;
  }else{
    setSuccessFor(registerPassword);
  }

  if(password2Value === '') {
    setErrorFor(registerPassword2, 'Masukkan kata sandi anda');
    isValid = false;
  } else if(passwordValue !== password2Value){
    setErrorFor(registerPassword2, 'Kata sandi anda tidak cocok.');
    setErrorFor(registerPassword, ' ');
    isValid = false;
  }else if(!isRegisterPassword2(password2Value)){
    setErrorFor(registerPassword2, 'Kata sandi minimal 8 karakter.');
    isValid = false;
  }else{
    setSuccessFor(registerPassword2);
  }
  // 返回校验结果
  return isValid;
}

function checkInputsLogin() {
  // 新增校验状态标记,默认通过
  let isValid = true;
  // Nangkep Value dar input
  const emailValue = loginEmail.value.trim(); 
  const passwordValue = loginPassword.value.trim();

  if(emailValue === '') {
    setErrorFor(loginEmail, 'Masukkan email anda');
    isValid = false;
  }else{
    setSuccessFor(loginEmail);
  }

  if(passwordValue === '') {
    setErrorFor(loginPassword, 'Masukkan password anda');
    isValid = false;
  }else if(!isLoginPassword(passwordValue)){
    setErrorFor(loginPassword, 'Kata sandi minimal 8 karakter.');
    isValid = false;
  }else{
    setSuccessFor(loginPassword);
  }
  // 返回校验结果
  return isValid;
}

function setErrorFor(input, message) {
  const formControl = input.parentElement;
  const small = formControl.querySelector('small');

  // error message
  small.innerText = message;

  // error class
  formControl.className = 'form-control-akun error'
}

function setSuccessFor(input, message) {
  const formControl = input.parentElement;
  formControl.className = 'form-control-akun success'
}

function isRegisterPassword(registerPassword){
  return /.{8,}$/.test(registerPassword);
}
function isRegisterPassword2(registerPassword2){
  return /.{8,}$/.test(registerPassword2);
}

function isLoginPassword(loginPassword){
  return /.{8,}$/.test(loginPassword);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:36:03