Задача
СкопированоВозможно, вы хотите иметь больше контроля над вашей формой: показывать лоадер при отправке данных или обновить интерфейс ещё до получения ответа сервера. Если у формы есть атрибут method со значением get или post, то при отправке формы страница перезагрузится. Разберёмся, как отключить это дефолтное поведение и взять все в свои руки.
Готовое решение
Скопировано
        
          
          <form>  <label>    Почта:    <input type="email" autocomplete="email" name="email" required>  </label>  <label>    Пароль:    <input type="password" name="password" autocomplete="current-password" required>  </label>  <button type="submit">Войти</button></form>
          <form>
  <label>
    Почта:
    <input type="email" autocomplete="email" name="email" required>
  </label>
  <label>
    Пароль:
    <input type="password" name="password" autocomplete="current-password" required>
  </label>
  <button type="submit">Войти</button>
</form>
        
        
          
        
       
        
          
          const form = document.querySelector("form")const submitButton = document.querySelector("button")if (form) {  form.addEventListener("submit", handleFormSubmit)}async function handleFormSubmit(event) {  // Отключаем дефолтное поведение  event.preventDefault()  disableButton()  try {    showLoader()    const response = await fetch("/api/login", {      method: "POST",      body: new FormData(form)    })    const result = await response.json()  } catch (error) {    showError(error)  } finally {    hideLoader()    enableButton()  }}function disableButton() {  if (submitButton) submitButton.disabled = true}function enableButton() {  if (submitButton) submitButton.disabled = false}function showLoader() {  // Показываем пользователю лоадер}function hideLoader() {  // Скрываем лоадер от пользователя}function showError() {  // Показываем пользователю ошибку}
          const form = document.querySelector("form")
const submitButton = document.querySelector("button")
if (form) {
  form.addEventListener("submit", handleFormSubmit)
}
async function handleFormSubmit(event) {
  // Отключаем дефолтное поведение
  event.preventDefault()
  disableButton()
  try {
    showLoader()
    const response = await fetch("/api/login", {
      method: "POST",
      body: new FormData(form)
    })
    const result = await response.json()
  } catch (error) {
    showError(error)
  } finally {
    hideLoader()
    enableButton()
  }
}
function disableButton() {
  if (submitButton) submitButton.disabled = true
}
function enableButton() {
  if (submitButton) submitButton.disabled = false
}
function showLoader() {
  // Показываем пользователю лоадер
}
function hideLoader() {
  // Скрываем лоадер от пользователя
}
function showError() {
  // Показываем пользователю ошибку
}
        
        
          
        
       Разбор решения
СкопированоНапишем простую формочку с двумя полями: почтой и паролем.
        
          
          <form>  <label>    Почта:    <input type="email" autocomplete="email" name="email" required>  </label>  <label>    Пароль:    <input type="password" name="password" autocomplete="current-password" required>  </label>  <button type="submit">Войти</button></form>
          <form>
  <label>
    Почта:
    <input type="email" autocomplete="email" name="email" required>
  </label>
  <label>
    Пароль:
    <input type="password" name="password" autocomplete="current-password" required>
  </label>
  <button type="submit">Войти</button>
</form>
        
        
          
        
       Найдём нашу форму по тегу <form>.
        
          
          const form = document.querySelector("form")
          const form = document.querySelector("form")
        
        
          
        
       На форму добавим обработчик события submit и отключим дефолтное поведение события с помощью метода prevent.
        
          
          if (form) {  form.addEventListener("submit", handleFormSubmit)}async function handleFormSubmit(event) {  event.preventDefault()}
          if (form) {
  form.addEventListener("submit", handleFormSubmit)
}
async function handleFormSubmit(event) {
  event.preventDefault()
}
        
        
          
        
       Теперь наша страница не будет перезагружаться, а мы можем, например, не только отправить запрос, но и показать пользователю лоадер или ошибку.
        
          
          async function handleFormSubmit(event) {  // Отключаем дефолтное поведение  event.preventDefault()  try {    showLoader()    const response = await fetch("/api/login", {      method: "POST",      body: new FormData(form)    })    const result = await response.json()  } catch (error) {    showError(error)  } finally {    hideLoader()  }}function showLoader() {  // Показываем пользователю лоадер}function hideLoader() {  // Скрываем лоадер от пользователя}function showError() {  // Показываем пользователю ошибку}
          async function handleFormSubmit(event) {
  // Отключаем дефолтное поведение
  event.preventDefault()
  try {
    showLoader()
    const response = await fetch("/api/login", {
      method: "POST",
      body: new FormData(form)
    })
    const result = await response.json()
  } catch (error) {
    showError(error)
  } finally {
    hideLoader()
  }
}
function showLoader() {
  // Показываем пользователю лоадер
}
function hideLoader() {
  // Скрываем лоадер от пользователя
}
function showError() {
  // Показываем пользователю ошибку
}
        
        
          
        
       Также можно отключить кнопку, пока сервер не пришёл с ответом, чтобы предотвратить повторную отправку формы.
        
          
          async function handleFormSubmit(event) {  // Отключаем дефолтное поведение  event.preventDefault()  disableButton()  try {    showLoader();    const response = await fetch("/api/login", {      method: "POST",      body: new FormData(form)    })    const result = await response.json()  } catch (error) {    showError(error)  } finally {    hideLoader()    enableButton()  }}function disableButton() {  if (submitButton) submitButton.disabled = true}function enableButton() {  if (submitButton) submitButton.disabled = false}
          async function handleFormSubmit(event) {
  // Отключаем дефолтное поведение
  event.preventDefault()
  disableButton()
  try {
    showLoader();
    const response = await fetch("/api/login", {
      method: "POST",
      body: new FormData(form)
    })
    const result = await response.json()
  } catch (error) {
    showError(error)
  } finally {
    hideLoader()
    enableButton()
  }
}
function disableButton() {
  if (submitButton) submitButton.disabled = true
}
function enableButton() {
  if (submitButton) submitButton.disabled = false
}