2010-05-25 3 views
3

это часть проверки в моей формеJavaScript проверка формы, не дожидаясь ответа AJAX

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 все равно будет

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

ответ

6

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

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

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

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


Вторая попытка синхронного вызова. Кажется, что это действительно работает - протестировано в 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

я изменил его на ложь и получил ту же проблему ... я думаю, я просто работать с XMLHttpRequest причиной Я не знаю другого выбора. я хотел работать с ajax, потому что он уже загружен на мою страницу и не хочет работать с другим объектом –

+0

@ Y.G.J вам нужно изменить структуру вашего вызова: вам нужно назначить результат вызова ajax(). Предположительно, именно там появляется «false». На данный момент вы не обрабатываете результат обратного вызова успеха. –

+0

+1 для всех разъяснений в разделе комментариев моего сообщения. –

0

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

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

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

Добавить асинхронные: фальшивы, как показано в коде, чтобы сделать это синхронный вызов,

Смежные вопросы