Задача
СкопированоВозможно, вы хотите иметь больше контроля над вашей формой: показывать лоадер при отправке данных или обновить интерфейс ещё до получения ответа сервера. Если у формы есть атрибут 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
}