Ответ 1
Проблема заключается в том, что onreadystatechange
не будет срабатывать, пока... дождитесь его... состояние изменится. Поэтому, когда вы return status;
большую часть времени не успеете установить. Что вам нужно сделать, это return false;
всегда и внутри onreadystatechange
определить, хотите ли вы продолжить или нет. Если да, то вы отправляете форму. Короче, возьмите код, который обрабатывает возвращаемое значение и вместо этого запустит его из обработчика readystatechange. Вы можете сделать это напрямую:
request.onreadystatechange = function() {
if (request.readyState == 4) {
var resp = parseInt(request.responseText, 10);
switch (resp) {
case 0:
document.getElementById('myform').submit();
break;
case 1:
alert("The display name has already been taken.");
break;
case 2:
alert("This student ID has already been registered");
break;
}
}
}
return false; // always return false initially
или передав continuation функцию, которая делает асинхронный вызов:
function checkUser(success, fail) {
...
request.onreadystatechange = function() {
if (request.readyState == 4) {
var resp = parseInt(request.responseText, 10);
switch (resp) {
case 0:
success(request.responseText);
case 1:
fail("The display name has already been taken.", request.reponseText);
break;
case 2:
fail("This student ID has already been registered", request.reponseText);
break;
default:
fail("Unrecognized resonse: "+resp, request.reponseText);
break;
}
}
}
В дополнение к этому перед стандартным return false;
вы можете иметь какой-то индикатор того, что что-то происходит, возможно, отключите поле отправки, покажите кружок загрузки и т.д. В противном случае пользователи могут запутаться, если это для получения данных требуется много времени.
Дальнейшее объяснение
Хорошо, поэтому причина, по которой вы не работали, в основном в этой строке:
request.onreadystatechange = function() {
Что это значит, говорит, что при изменении onreadystatechange
запроса AJAX будет выполняться анонимная функция, которую вы определяете. Этот код НЕ выполняется сразу. Он ждет события. Это асинхронный процесс, поэтому в конце определения функции javascript будет продолжать работать, и если состояние не изменилось к моменту его получения до return status;
, переменная status
, очевидно, не успела бы установить, а ваша script не будет работать должным образом. Решение в этом случае должно всегда return false;
, а затем, когда событие срабатывает (т.е. Сервер ответил с выходом PHP скрипт), вы можете определить статус и отправить форму, если все в порядке.