Ajax-запрос отправляется при отправке, но у него недостаточно времени для получения ответа до отправки формы.Чтобы предотвратить отправку формы, вы можете использовать event.preventDefault
:
document.getElementById("submittion").addEventListener("click", function(event) {
event.preventDefault();
// The ajax call
});
Обновление
Возможно, вы хотите прослушать форму submit
событие вместо кнопки click
(например, для поддержки клавиатуры).Тем не менее, проблема заключается в том, что обработчик отправки должен «ждать» асинхронной проверки AJAX.
Чтобы сделать эту работу, вы можете отслеживать, проверен ли пользователь, и выполнить повторную отправку, отключив проверку (приведенный ниже непроверенный код):
const form = document.getElementById("register");
const username = form.querySelector("input[name=username]");
let checkUser = true;
form.addEventListener("submit", function(event) {
if (checkUser) {
// Prevent the form from submitting
event.preventDefault();
// Check the username
$.get("/check?username=" + username.value, function (data) {
if (data === false) {
alert("Username is not available!");
} else {
// Resubmit the form without the user check
checkUser = false;
form.submit();
return;
}
});
}
// Reset the variable for the next check
checkUser = true;
});
Альтернатива
Вы также можете отправить прямо на маршрут /register
(через ajax) и выполнить там проверку / проверку.Когда все в порядке, вы можете зарегистрировать пользователя и вернуть true, в противном случае вернуть false, если проверка не удалась:
form.addEventListener("submit", function(event) {
// Prevent the form from submitting
event.preventDefault();
// Post the form data
$.post(form.action, form.serialize(), function(data) {
if (data === false) {
// Register failed
alert("Username is not available!");
} else {
// Register successfull
window.location.replace("/welcome");
}
});
});
И, может быть, вы все-таки можете попытаться избежать JavaScript, выполнив все действия логики на стороне сервера, и обработать шаблонс ошибками формы.Но это выходит за рамки этого вопроса;)