2010-10-07 16 views
8

Napisałem funkcję, która ma sprawdzić, czy nazwa użytkownika została podjęta, czy nie. Teraz, gdy wywołuję funkcję z innej funkcji i powiadamiam ją o zwracanej wartości:Zwracanie odpowiedzi z wywołania JQuery AJAX

 alert(checkusernameavailable('justausername'));

oznacza "niezdefiniowany". Szukałem wysokiego i niskiego poziomu, ale nie mogę znaleźć tego, co robię źle. Myślę, że powinien po prostu zwrócić php-echo w check.php, ale tak nie jest. Oto funkcja, którą napisałem:

var checkusernameavailable = function(value) { 
    $.ajax({ 
     url: "check.php", 
     type: "POST", 
     async: false, 
     cache: false, 
     data: "username=" + value + "", 

     success: function(response) { 
     alert(response); 
     return response;   
     }, 
     error: function() { 
     alert('ajax error'); 
     } 
    }); 
    }

Co robię źle?

Odpowiedz

10

Połączenia AJAX są asynchroniczne, co oznacza, że ​​zwracają dane dopiero po zakończeniu operacji. To znaczy. metoda checkusernameavailable nigdy nie zwraca żadnych informacji (chyba że sam przekażesz to w ramach tej metody). Należy wykonać następujące czynności:

// Just fire and forget the method 
checkusernameavailable("userName"); 

// Change the success function to do any display you require 
success: function(response) { 
    alert(response); 
    $("#SomeDiv").html(response);  
    }, 

Metoda uruchamia metodę asynchronizacji AJAX, która wysyła posty do pliku check.php. Gdy odpowiedź zostanie odebrana, użytkownik obsługuje tę odpowiedź w funkcji powiązanej z oddzwanianiem powodzenia z $.ajax. Można określić funkcję bezpośrednio do tego sukcesu zwrotnego, a także:

// Change success to point to a function name 
success: foo 

// Create a function to handle the response 
function foo(response) 
{ 
    // Do something with response 
} 

EDIT:

Zgodnie z komentarzem OP, trzeba zmienić wywołanie AJAX być synchroniczny, zamiast asynchroniczny (I nigdy wcześniej nie zrobił synchronicznego połączenia tak sobie, więc to niesprawdzone):

var ajaxResponse; 

$.ajax({ 
    async: false, 
    success : function (response) 
       { 
        ajaxResponse = response; 
       }, 
    // other properties 
}); 

return ajaxResponse; 

Pełna API wystawianie here.

+0

Dziękuję za odpowiedź, rozumiem to. Ale to nie rozwiązuje mojego problemu. Pozwól mi wyjaśnić, czego chcę nieco dalej. Wypalam funkcję checkusername dostępną z poziomu innej funkcji, która odpala, gdy mój formularz zostanie przesłany. Więc co robię to: if (! Checkusernameavailable (nazwa_użytkownika.val())) { return false; // nie przesyłaj formularza // i zaznacz pola czerwone, odkrywając wielojęzyczne komunikaty o błędach (Które - btw - oznacza, że ​​nie mogę wstawić odpowiedzi bezpośrednio do mojego html ...) } –

+0

@ user468893 - Zobacz moje edytować. Musisz wykonać synchroniczne wywołanie Async AJAX. – GenericTypeTea

+0

To już było, ale to nie była sztuczka :) Wartością zwracaną była magia. Dzięki! –

Powiązane problemy