Проверка формы в JavaScript, не дожидаясь ответа AJAX - PullRequest
3 голосов
/ 25 мая 2010

это часть чека в моей форме

function check(theform) {
var re = /^\w[0-9A-Za-z]{5,19}$/;
if (!re.test(theform.username.value)) { 
    alert("not valid username");
    theform.username.focus();
    return false;
}

$.ajax({
    type: "POST",
    url: "username.asp",
    data: "username="+theform.username.value,
    success: function(msg){
        username = msg;
        if (!username) {
            alert("username already in use");
            return false;
        }
    }
});

var re = /^\w[0-9A-Za-z]{5,19}$/;
if (!re.test(theform.password.value)) { 
    alert("not valid password");
    theform.password.focus();
    return false;
}
}

по какой-то причине синхронизации ... он проверяет имя пользователя, затем дублирует имя пользователя с ajax и не ждет ответа и переходит к проверке пароля.

Я не хочу вставлять оставшуюся часть кода в isreadystate (или что бы то ни было), потому что я могу переместить проверку дублирования имени пользователя в конец ... и тогда функция завершится раньше, чем ajax

что мне делать?

Ответы [ 2 ]

6 голосов
/ 25 мая 2010

Первый A в AJAX означает «Асинхронный». Вызов выполнен, и выполнение функции продолжено без ожидания возврата вызова.

Вы можете установить опцию async в своем вызове на false, делая ваш вызов синхронным. Однако вам придется изменить свои функции, чтобы return false перешел на функцию check, и это не рекомендуется в руководстве jQuery:

Первая буква в Ajax обозначает «асинхронный», что означает, что операция происходит параллельно, и порядок выполнения не гарантируется. Параметр async для $ .ajax () по умолчанию имеет значение true, указывая, что выполнение кода может продолжаться после выполнения запроса. Настоятельно не рекомендуется устанавливать для этой опции значение false (и, следовательно, делать вызов более не асинхронным), поскольку это может привести к тому, что браузер перестанет отвечать на запросы.

лучшим способом было бы сделать проверки, которые вы можете выполнить в режиме реального времени внутри функции, затем запустить запрос Ajax и отправить форму в обратном вызове успеха этого запроса .


2-я попытка синхронного вызова. Кажется, это действительно работает - проверено в FF 3.6.

var name_success = true;

$.ajax({
    type: "POST",
    async: false,
    url: "username.asp",  // Needs to return "EXISTS" in this example 
    data: "username="+theform.username.value,
    success: function(msg){
        username = msg;
        if (username == "EXISTS") {  // Changed callback return value - 
                                     // safer this way
            alert("username already in use");
            name_success = false;   // should work because
                                    // we're in check()'s scope
            return false;
        }
    }
});

alert (name_success);
0 голосов
/ 25 мая 2010

ваш код сначала выполнит проверку имени пользователя, в случае успеха вызов ajax, так как вызов ajax асинхронный, выполнение кода продолжается до проверки пароля.

возврат false внутри следующего кода не имеет никакого смысла, поскольку успех - это метод обратного вызова, когда ajax-вызов завершается успешно.

success: function(msg){
    username = msg;
    if (!username) {
        alert("username already in use");
        return false;
    }
}

Добавьте async: false, как показано в коде, чтобы сделать его синхронным вызовом,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...