2010-10-07 15 views
8

Ho scritto una funzione, che deve controllare se un nome utente è stato preso o meno. Ora quando chiamo la funzione da un'altra funzione e avviso il suo valore di ritorno:Restituzione della risposta da una chiamata Jquery AJAX

 alert(checkusernameavailable('justausername'));

dice "non definito". Ho cercato in alto e in basso, ma non riesco a trovare quello che sto facendo male. Suppongo che dovrebbe solo restituire php-echo in check.php, ma non è così. Ecco la funzione che ho scritto:

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'); 
     } 
    }); 
    }

Cosa sto facendo male?

risposta

10

Le chiamate AJAX sono asincrone, il che significa che restituiscono solo i dati una volta completata l'operazione. Cioè il metodo checkusernameavailable non restituisce mai alcuna informazione (a meno che non lo dici all'interno di tale metodo stesso). È necessario effettuare quanto segue:

// 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);  
    }, 

Il metodo genera il metodo asincrono AJAX che invia a check.php. Quando viene ricevuta la risposta, la risposta viene quindi gestita in funzione associata alla callback di successo di $.ajax. È possibile specificare una funzione direttamente a quel successo richiamata così:

// 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:

Come per il commento del PO, è necessario modificare la chiamata AJAX per essere sincrona, invece di asincrono (I l 'ho mai fatto una chiamata sincrona come questo me stesso, quindi questo è testato): messa in vendita di

var ajaxResponse; 

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

return ajaxResponse; 

API completa here.

+0

Grazie per la risposta, lo capisco. Ma non risolve il mio problema. Lascia che ti spieghi cosa voglio un po 'oltre. Sto sparando la funzione checkusernameavailable dall'interno di un'altra funzione, che si attiva quando viene inoltrata la mia forma. Quindi quello che sto facendo è: if (! Checkusernameavailable (username_box.val())) { return false; // non inviare il modulo // e rendere rosso alcune caselle, nascondendo i messaggi di errore multilingue (che - btw - significa che non posso inserire la risposta direttamente nel mio html ...) } –

+0

@ user468893 - Vedere il mio modificare. È necessario rendere sincrona la chiamata Async AJAX. – GenericTypeTea

+0

Lo era già, ma quello non era il trucco :) Il valore di ritorno ha fatto la magia. Grazie! –

Problemi correlati