验证表单时仅在 JS 中延迟页面重新加载

Delay page reload only in JS when form is validated

希望你一切都好 ;)

我的问题:

在表单中,我希望在验证后在发送和重新加载页面之前对点击应用 3 秒的延迟,以便显示验证消息。 这是代码:

//DOM elements
const firstName = document.getElementById("first");
const lastName = document.getElementById("last");
const validateForm = document.getElementById("validate");
const sendButtonValidation = document.getElementById("send_button");
const errorMessageFirstname = document.getElementById("error_message_firstname");
const errorMessageLastname = document.getElementById("error_message_lastname");
const confirmationMessage = document.getElementById("message_validation");

//validationName function
const validateFirstname = (firstName) => {
  return firstName.value.length >= 2;
}  
const validateLastname = (lastName) => {
  return lastName.value.length >= 2;
}

// tableau objets 
const array = [
  
  {key: firstName,
  fn:()=>validateFirstname(firstName),
  el: errorMessageFirstname,},
  
  {key: lastName,
  fn:()=>validateLastname(lastName),
  el: errorMessageLastname,},
  ];

 //general form submit submit function (event when submit)
 validateForm.addEventListener("submit", (e)=>{

   let isOk = true;
   
  
   // call array objects for function display error message
   array.forEach((item)=>{
     let validateInput = item.fn();
     
     // display ternary error messages
     item.el.style.display = validateInput ? "none" : "block";
     
// block sending form if error
     if (validateInput === false){
       isOk = false;
       e.preventDefault();
      } 
    
    })
    
    // modal display function for form confirmation with timeOut
    function confirmMessageForm () {
      confirmationMessage.style.display = "flex";
      setTimeout(() => {
        confirmationMessage.style.display = "none";
      }, 3000);
    }

    
    // appearance of confirmation window if form ok
    if (isOk){ 
      sendButtonValidation.onclick = () =>{
        setTimeout(validateForm, 3000);
      }
      confirmMessageForm();
      closeModal();
    }
 
}) 
.error_message{
  font-size: 0.7em;
  color: #e54858;
  display: block;
  margin-top: 7px;
  margin-bottom: 7px;
  line-height: 1;
  opacity: 1;
  transition: 0.3s;
  display: none;
}
.message-validation{
  display: none;
  align-items: center;
  justify-content: center;
  position: fixed;
  z-index: 1;
  left: 13%;
  top: 41%;
  overflow: auto;
  background-color: rgba(26, 39, 156, 0.9);
  color: white;
  padding: 5%;
  border-radius: 5px;
}
  <form   
              novalidate
              name="reserve"
              action="index.html"
              method="get"
              id="validate"
            >
              <div
                class="formData">
                <label for="first">Prénom</label><br>
                <input
                  class="text-control"
                  type="text"
                  id="first"
                  name="first"
                  required
                /><br> 
                <span class="error_message"
                      id="error_message_firstname">
                  Veuillez entrer deux caractères ou plus pour ce champ
                </span>
              </div>
              <div
                class="formData">
                <label for="last">Nom</label><br>
                <input
                  class="text-control"
                  type="text"
                  id="last"
                  name="last"
                  required
                /><br>
                <span class="error_message"
                  id="error_message_lastname">
                    Veuillez entrer deux caractères ou plus pour ce champ
                </span>
              </div>
   <input
                class="btn-submit"
                type="submit"
                class="button"
                id="send_button"
                method="get"
                value="C'est parti" 
              />
  
  
  
   <div id="message_validation" class="message-validation">
          Bravo! Votre réservation est prise en compte.
        </div>

消息显示但不到一秒,然后 页面重新加载太快。我正在尝试使用一个函数将页面重新加载延迟 3 秒,但它不起作用。我只能在 JS 中找到解决方案。

非常感谢您的帮助!

这是因为您正在使用 <input type="submit">。提交将根据您在标记中提供的操作 url 重新加载页面。

只需将您的输入类型切换为 button 并通过您的 JS 代码处理重新加载!

在您的函数中添加 e.preventDefault()。 validateForm.addEventListener("提交", (e)=>{ e.preventDefault() }) 当您提交表单时它将停止重新加载。