function check_username(){
    $.ajax({
        type: "POST",
        dataType: 'json',
        url: "/ajax/check/username.html",
        data: "via=ajax&username="+$('input[name=register_username]').val(),
        success: function(msg){
            if(msg.response==false){
                register_username.parent().css('background-color','#db2e24');
                register_username.parent().parent().find('td:last-child').text(msg.message);
                register_username.focus();
                return false;
            } else {
                register_username.parent().css('background-color','#fff');
                register_username.parent().parent().find('td:last-child').text("");
                return true;
            }
       }
    });
}

Je suis désolé si mon anglais n'est pas bon - l'anglais n'est pas ma langue maternelle. Retour au sujet, pourquoi la fonction ci-dessus renvoie-t-elle toujours false? FYI: le JSON est OK

0
Bias Tegaralaga 27 sept. 2011 à 07:10

3 réponses

Meilleure réponse

check_username appelle une fonction ajax qui démarre une opération de mise en réseau puis revient immédiatement. check_username retourne bien avant la fin de l'appel ajax et l'appel du gestionnaire de réussite. Ainsi, le gestionnaire de réussite n'a RIEN à voir avec la valeur renvoyée par check_username.

Puisqu'il n'y a pas de valeur de retour dans la fonction check_username elle-même (uniquement dans la fonction de gestionnaire de succès intégré), check_username renvoie undefined qui est une valeur de falsey, donc vous pensez qu'elle retourne toujours false.

Si vous voulez faire quelque chose avec la valeur de retour du gestionnaire de réussite, vous devez alors opérer dans le gestionnaire de réussite lui-même ou appeler une autre fonction à partir du gestionnaire de réussite. Voici comment fonctionnent les opérations asynchrones.

Le renvoi de true ou false à partir de la fonction de gestionnaire de réussite ne fait rien. Le gestionnaire de succès est appelé par les internes du code de gestion ajax et le retour du gestionnaire de succès va simplement dans les entrailles des internes ajax. La valeur de retour du gestionnaire de réussite n'est en aucun cas utilisée.

4
jfriend00 27 sept. 2011 à 03:15

Le problème est la condition logique msg.response == false .. cela vaut toujours false, la réponse n'est pas un booléen. Vous devez plutôt vérifier l'état de la réponse.

0
Anas Karkoukli 27 sept. 2011 à 03:16

Si je devais deviner, vous postez, et la réponse retournée est un objet JSON. Mais cela ressemble à votre vérification pour voir si vous avez obtenu une réponse valide. Pourquoi ne pas l'essayer de cette façon:

Essaye ça:

function check_username()
        {
            $.ajax({
                type: "POST",
                dataType: 'json',
                url: "/ajax/check/username.html",
                data: "via=ajax&username="+$('input[name=register_username]').val(),
                success: function( msg, textStatus )
                {
                    if ( textStatus == "success" )
                    {
                        register_username.parent().css('background-color','#db2e24');
                        register_username.parent().parent().find('td:last-child').text(msg.message);
                        register_username.focus();
                        return false;
                    } else {
                        register_username.parent().css('background-color','#fff');
                        register_username.parent().parent().find('td:last-child').text("");
                        return true;
                    }
                },
                error: function( jqXHR, textStatus, errorThrown )
                {
                    if ( textStatus == "parsererror" )
                    {
                        alert( "There is an error in your JSON object" );
                    }
                }
            });
        }

L'autre problème que vous pourriez avoir est que vous ne renvoyez pas un json valide, que jQuery vérifiera. L'ajout d'une erreur aidera à révéler si tel est bien le cas.

Démo en direct http://jsfiddle.net/khalifah/4q3EJ/

0
b01 27 sept. 2011 à 04:00