2013-03-28 5 views
0

J'essaye de renvoyer vrai pour la fonction validator.registercallback entière si le script ajax suivant ne renvoie pas 1. Cependant, il ne fonctionne pas, et je pense que c'est probablement quelque chose de basique que je suis manquant, mais je ne peux pas le comprendre.Ajax ne me laisse pas retourner vrai ou faux

validator.registerCallback('unique_username', function(value) { 

     //use ajax to run the check 
     var xmlhttp; 
if (window.XMLHttpRequest) 
    {// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
    } 
else 
    {// code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
xmlhttp.onreadystatechange=function() 
    { 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
     if(xmlhttp.responseText != 1) { 
      alert('Username Exists'); 
      return false; 
     } else { 
      alert('Username Available!'); 
      return true; 
     } 
    } 
    } 
xmlhttp.open("GET","uniqueuser.php?username="+value,true); 
xmlhttp.send(); 

}) 

Ce qui est bizarre est que les œuvres suivantes, il ne fonctionne tout simplement en fonction de la valeur de ne pas le script ajax:

validator.registerCallback('unique_username', function(value) { 

     //use ajax to run the check 
     var xmlhttp; 
if (window.XMLHttpRequest) 
    {// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
    } 
else 
    {// code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
xmlhttp.onreadystatechange=function() 
    { 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
     if(xmlhttp.responseText != 1) { 
      alert('Username Exists'); 
      return false; 
     } else { 
      alert('Username Available!'); 
      return true; 
     } 
    } 
    } 
xmlhttp.open("GET","uniqueuser.php?username="+value,true); 
xmlhttp.send(); 

return true; 

}) 

Donc, fondamentalement, je peux le dire de revenir vrai dans la principale fonction, mais quand j'essaie de le rendre vrai seulement si la valeur dans le script ajax ne retourne pas 1, cela ne fonctionne pas. En passant, les alertes fonctionnent. Donc, il obtient la bonne valeur, mais il ne reviendra pas vrai, ou faux d'ailleurs.

Toute aide est appréciée!

Mise à jour

validator.registerCallback('unique_username', function(value) { 

     //use ajax to run the check 
function ajax_result() { 
    var xmlhttp; 
if (window.XMLHttpRequest) 
    {// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
    } 
else 
    {// code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
xmlhttp.onreadystatechange=function() 
    { 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
    } 
    } 
xmlhttp.open("GET","uniqueuser.php?username="+value,true); 
xmlhttp.send(); 
} 

if(ajax_result() != 1) { 

alert('Username Exists'); 
return false; 

} else { 

alert('Username Available!'); 
return true; 

} 

}) 
+2

Chercher « ajax valeur de retour » le * bit asynchrone * est particulièrement important .. aussi, pensez à utiliser une bibliothèque pour AJAX (et non, je ne se soucient pas que l'on , mais puisque * vous l'avez marqué comme jQuery * ..) –

+0

http://stackoverflow.com/questions/5316697/jquery-return-data-after-ajax-call-success - jQuery, mais devrait montrer le point (et comment pour écrire du code plus propre) et si vous voulez * synchrone * comportement (ick!) voir http://stackoverflow.com/questions/2942544/synchronous-calls-with-jquery –

+0

J'ai essayé d'utiliser la version de jquery mais cela n'a pas fonctionné non plus – user1751581

Répondre

0

Vous avez ajouté jQuery à la liste des mots-clés à cette question, donc je répondre à l'aide jQuery:

var username = "foo"; 
$.get('uniqueuser.php', {username: username}, function(webpage) 
{ 
    if (webpage == 1) 
    alert("user exists"); 
    else 
    alert("Username available!"); 
}); 
+0

'validator.registerCallback ('nom_utilisateur_ unique', fonction (valeur) { var nom_utilisateur = valeur; $ .get ('uniqueuser.php ', {nom d'utilisateur: nom d'utilisateur}, fonction (page Web) { if (page Web == 1) { alert ("Nom d'utilisateur disponible!"); \t return true; } else { alert ("Nom d'utilisateur existe"); \t return false; } }); }) ' Quand je l'ai fait je suis arrivé les alertes droite, mais son ne pas retourner la fonction vraie ou fausse – user1751581

+0

Je veux retourner true ou false pour la fonction fonction' (valeur) 'dans le validateur – user1751581

+0

Ah, peut-être vous devez mettre le code que j'écrivais dans une fonction qui prend deux paramètres, la fonction is_user_existing (nom d'utilisateur, continuation), continuation est un objet fonction qui sera appelé avec le résultat de l'appel ajax. Ensuite, vous utilisez is_user_existing ('foo', fonction (resultat) {/ * do someting * /}); et le résultat est vrai ou faux. –

1

Ce que vous manque est que l'appel ajax est asynchrone. Lorsque votre fonction se termine, l'appel ajax n'est pas encore terminé et la valeur (true ou false) ne sera renvoyée que plus tard. Pour résoudre ce problème, vous devez soit synchroniser l'appel ajax, soit modifier votre logique de chaînage, par exemple l'inverser et exécuter validator.registerCallback() dans l'appel ajax. Vous pouvez également envisager des techniques plus sophistiquées comme promises.

[Mise à jour] Voici comment vous faites la demande synchrone:

xmlhttp.open("GET","uniqueuser.php?username="+value,false); 

Vous aurez également besoin de changer le reste du code, voir par exemple this MDN article.

+0

comment puis-je le rendre synchrone? – user1751581

+0

Je l'ai cherché mais je ne peux pas trouver où mettre async = false dans mon code – user1751581

+0

Voir ma mise à jour ... – Christophe

0

Essayer à nouveau:

is_user_existing('foo', function(result) 
{ 
    if (result) 
    alert("user is existing"); 
    else 
    alert("user is not existing"); 
}); 

function is_user_existing(username, continuation) 
{ 
    $.get('uniqueuser.php', {username: username}, function(webpage) 
    { 
     continuation (webpage == 1); 
    }); 
} 
+0

La raison de ne pas avoir une valeur de retour ordinaire de is_user_existing est que la fonction retourne avant que l'appel ajax ait un résultat –

+0

Je ne sais pas comment corriger cela ... J'ai édité votre réponse avec ce que j'ai essayé, et ne fonctionne pas – user1751581

+0

J'essaie toujours de renvoyer vrai ou faux à 'validator.registerCallback ('nom_utilisateur unique', fonction (valeur)' – user1751581