Home > Software design >  Delay page reload only in JS when form is validated
Delay page reload only in JS when form is validated

Time:05-07

Hope you're well ;)

My problem:

In a form, I would like, when it's validated, to apply a delay of 3 seconds to the click before sending and reloading the page in order to show a validation message. Here is the code:

//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
                >
                <label for="first">Prénom</label><br>
                <input
                  
                  type="text"
                  id="first"
                  name="first"
                  required
                /><br> 
                <span 
                      id="error_message_firstname">
                  Veuillez entrer deux caractères ou plus pour ce champ
                </span>
              </div>
              <div
                >
                <label for="last">Nom</label><br>
                <input
                  
                  type="text"
                  id="last"
                  name="last"
                  required
                /><br>
                <span 
                  id="error_message_lastname">
                    Veuillez entrer deux caractères ou plus pour ce champ
                </span>
              </div>
   <input
                
                type="submit"
                
                id="send_button"
                method="get"
                value="C'est parti" 
              />
  
  
  
   <div id="message_validation" >
          Bravo! Votre réservation est prise en compte.
        </div>

The message is displayed but less than a second and then page reloads too quickly. I am trying to use a function to delay page reload for 3s but it doesn't work. I have to find a solution only in JS.

Thank you very much for your help !

CodePudding user response:

It's because you're using <input type="submit">. Submit will reload the page based on your provided action url in the tag.

Simply switch your input type to submit and handle the reload via your JS code!

CodePudding user response:

Add e.preventDefault() in your funciton. validateForm.addEventListener("submit", (e)=>{ e.preventDefault() }) it will stop reloading when you submit the form.

  • Related