Я снова потерялся. У меня есть форма регистрации с тремя функциями JS, которые вызывают желаемый результат при вызове onchange из моей html-формы. Поэтому они генерируют предупреждение BS, когда пользователь заполняет форму. Эти три функции:onsubmit возвращает false, но submit выполняет в любом случае
Чтобы проверить длину пароля:
function checkPassword() {
var x = document.registerForm;
var wachtwoord = x.wachtwoord.value;
var errMsgHolder = document.getElementById("message");
if (wachtwoord.length < 3 || wachtwoord.length >30) {
errMsgHolder.innerHTML =
'<div class="alert alert-warning"><a href="#" class="close" data-dismiss="alert" aria-label="close">×</a><strong>Let op!</strong> Kies een wachtwoord van minimaal 3 en maximaal 30 tekens.</div>';
setTimeout(function() {document.getElementById("message").innerHTML =''; }, 5000);
return false;
}
}
Чтобы проверить, если 2 пароли совпадают:
function checkPasswordsMatch() {
var x = document.registerForm;
var wachtwoord = x.wachtwoord.value;
var herhaal_wachtwoord = x.herhaal_wachtwoord.value;
var errMsgHolder = document.getElementById("message");
if (wachtwoord !== herhaal_wachtwoord) {
errMsgHolder.innerHTML =
'<div class="alert alert-warning"><a href="#" class="close" data-dismiss="alert" aria-label="close">×</a><strong>Let op!</strong> Wachtwoorden komen niet overeen.</div>';
return false;
}
}
Чтобы проверить, если имя пользователя уже существует (Ajax вызов с помощью PHP в базу данных):
function checkBestaandeGebruikersnaam(){
var x = document.registerForm;
var gebruikersnaam = x.gebruikersnaam.value;
var errMsgHolder = document.getElementById("message");
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if(request.readyState === 4 && request.status === 200) {
if(request.responseText == "1") {
errMsgHolder.innerHTML = '<div class="alert alert-warning"><a href="#" class="close" data-dismiss="alert" aria-label="close">×</a><strong>Let op!</strong> Die gebruikersnaam is al bezet, kies een andere gebruikersnaam.</div>';
return false;
}
else {
errMsgHolder.innerHTML = '';
}
} else {
errMsgHolder.innerHTML = 'An error occurred during your request: ' + request.status + ' ' + request.statusText;
}
}
request.open("POST", "core/functions/checkBestaandeGebruikersnaam.php", true);
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.send("gebruikersnaam="+gebruikersnaam);
}
Но эти функции просто показывают предупреждение и не препятствуют пользователю отправлять форма с неверными данными. Поэтому я хочу пересмотреть эти функции, когда пользователь отправляет. Для этого у меня есть следующая строка в моей регистрационной форме HTML:
<form action="register.php" onsubmit="return validate()" name="registerForm" method="post" class="col-md-10 col-md-offset-1 col-xs-12 col-xs-offset-0">
Тогда в JS У меня есть следующие функции:
function validate() {
var errMsgHolder = document.getElementById("message");
if(checkPassword() === false) {
errMsgHolder.innerHTML =
'<div class="alert alert-warning"><a href="#" class="close" data-dismiss="alert" aria-label="close">×</a><strong>Let op!</strong> Kies een wachtwoord van minimaal 3 en maximaal 30 tekens.</div>';
return false;
} else if(checkPasswordsMatch() === false){
errMsgHolder.innerHTML =
'<div class="alert alert-warning"><a href="#" class="close" data-dismiss="alert" aria-label="close">×</a><strong>Let op!</strong> Wachtwoorden komen niet overeen.</div>';
return false;
} else if(checkBestaandeGebruikersnaam() === false){
errMsgHolder.innerHTML =
'<div class="alert alert-warning"><a href="#" class="close" data-dismiss="alert" aria-label="close">×</a><strong>Let op!</strong> Die gebruikersnaam is al bezet, kies een andere gebruikersnaam.</div>';
return false;
}
Когда я проверить это работает для checkPassword()
и checkPasswordsMatch()
. Значение Я получаю ожидаемые предупреждения BS, и подача формы отменяется. Но когда я тестирую checkBestaandeGebruikersnaam()
, это не так. Он кратко показывает предупреждение BS, но затем он продолжает мой файл register.php. Поэтому по какой-то причине он игнорирует возвращенное «ложное» в onsubmit и подчиняется в любом случае.
Я не могу опустить голову. Почему он делает это по-другому. Может ли кто-нибудь пролить свет на этот вопрос?
Редактировать: Я следил за ссылкой и провел остаток дня, пытаясь понять концепцию функций обратного вызова. Я думаю, что у меня есть это сейчас, но моя проблема не решена. Поэтому я все еще должен делать что-то неправильно.
Поскольку проблема, очевидно, связана с тем, что я возвращаю false из функции checkBestaandeGebruikersnaam()
Я буду перечислять только изменения этой функции. У меня есть следующий код сейчас:
HTML:
onchange="callAjax(checkBestaandeGebruikersnaam)"
JavaScript Основная функция:
function callAjax(callback){
var gebruikersnaam = document.registerForm.gebruikersnaam.value;
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if(request.readyState === 4 && request.status === 200) {
callback(request.responseText);
} else {
document.getElementById("message").innerHTML = 'An error occurred during your request: ' + request.status + ' ' + request.statusText;
}
}
request.open("POST", "core/functions/checkBestaandeGebruikersnaam.php", true);
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.send("gebruikersnaam="+gebruikersnaam);
}
JavaScript функция обратного вызова:
function checkBestaandeGebruikersnaam(result) {
if(result == "1") {
document.getElementById("message").innerHTML = '<div class="alert alert-warning"><a href="#" class="close" data-dismiss="alert" aria-label="close">×</a><strong>Let op!</strong> Die gebruikersnaam is al bezet, kies een andere gebruikersnaam.</div>';
return false;
}
else {
document.getElementById("message").innerHTML = '';
}
}
Может кто-нибудь сказать мне, если я использую функция обратного вызова правильно? Он выполняет как ожидалось (на событии onchange).
Функция validate()
по-прежнему не работает для checkBestaandeGebruikersnaam()
. Он все еще выполняется, даже если checkBestaandeGebruikersnaam() === false
. Что я теперь сделал не так? Пожалуйста, просветите меня и спасибо за ваше время.
Возможный дубликат [Как вернуть ответ от асинхронного вызова?] (Http://stackoverflow.com/questions/14220321/how-do-return-the-response-from-an-asynchronous- звонок) –