Variable globale Ajax

Résolu/Fermé
sispheor - Modifié par sispheor le 6/10/2011 à 16:34
jojo673 Messages postés 210 Date d'inscription lundi 19 septembre 2011 Statut Membre Dernière intervention 9 avril 2014 - 7 oct. 2011 à 13:02
Bonjour,

je suis débutant en javascript et je rencontre un petit souci pour affecter une variable dans une fonction ajax. J'explique le but de la fonction. Je vérifie en temps réel l'existence ou non du login saisi par l'utilisateur. La fonction renvoi faux dans le cas ou le login fait moins de 4 caractères ou si il est présent dans la base. Et renvoie vrai sinon. L'ajax fonctionne tres bien c'est juste que je veux affecter à la variable globale "reponse" la valeur "true" ou "false" suivant la le retour de l'ajax mais hélas cela ne fonctionne pas. En effet la valeur de retour de ma fonction check[login] est toujours la valeur que j'ai initialisé.
Help me plz les dev!

check['login'] = function() { 
        var retour = false; //par defaut on envoi faux (le retour de la fonction prend tjs cette valeur. Si ici je met true la fonction renvera true) 

 var login = document.getElementById('login'); 
 var valuelogin = document.getElementById('login').value; //on recup le login 
              
 var tooltipStyle = getTooltip(login).style;   //onrecup le css  
   var tooltip2 = getTooltip2(login).style;  
   if (valuelogin ==""){ //si rien dans la case  
    login.className = 'login'; //on rez la couleur à bleu 
   } 
    
   if (valuelogin.length < 4){//si pseudo trop court 
    tooltipStyle.display = 'none'; //on efface le premier tooltip 
    login.className = 'incorrect'; 
    tooltip2.display = 'inline-block'; 
    return false;   
   }else {  
   tooltip2.display = 'none'; //on efface le tooltip pseudo trop court 
    $.ajax({ // fonction permettant de faire de l'ajax 
     type: "POST",  
     url: "dispologin.php",  
     data: "valuelogin="+valuelogin,  
     success: function(msg){  
      if(msg==0) // si le pseudo est dispo 
      { 
       login.className = 'correct'; 
       tooltipStyle.display = 'none'; 
       retour= true;  //ici ça marche pas 
      } 
      if(msg==1) // pseudo pas dispo 
      { 
       login.className = 'incorrect'; 
       tooltipStyle.display = 'inline-block'; 
       retour= false; //marche pas 
      } 
         
     } 
    }); 
    return retour; //renvoi tjs la valeur initialisée en haut    
   }    
    
    
  }; 

11 réponses

jojo673 Messages postés 210 Date d'inscription lundi 19 septembre 2011 Statut Membre Dernière intervention 9 avril 2014 44
6 oct. 2011 à 23:42
Ce code me semble correct ! Peut-on voir le contenu de dispologin.php ?
0
sispheor Messages postés 44 Date d'inscription vendredi 25 mars 2011 Statut Membre Dernière intervention 9 juillet 2012 11
7 oct. 2011 à 09:06
Merci pour cette premiere réponse. Comme je l'ai expliqué la fonction ajax fonctionne et la page PHP me renvoi bien 1 ou zéro. Le problème est uniquement sur l'affectation de la variable réponse. Mais voici le code quand même!


//dispologin.php

<?php

$link = mysql_connect("localhost", "root", "p@ssw0rd") or die("Impossible de se connecter : " . mysql_error());
mysql_select_db("FTP");
 

// VERIFICATION
$result = mysql_query("SELECT nomuser FROM USERS WHERE nomuser='$_POST[valuelogin]'");
if(mysql_num_rows($result)==0){	//pas de ligne donc pseudo inexistant dans la base
	echo "0";
}
else{	//sinon si il y a une ligne dans la reponse
	echo "1";
}

?>

0
jojo673 Messages postés 210 Date d'inscription lundi 19 septembre 2011 Statut Membre Dernière intervention 9 avril 2014 44
7 oct. 2011 à 09:17
Donc si on utilise ce code :
success: function(msg){  
      alert(msg);
     } 
Il affiche bien le bon message ?
0
sispheor Messages postés 44 Date d'inscription vendredi 25 mars 2011 Statut Membre Dernière intervention 9 juillet 2012 11
7 oct. 2011 à 09:26
Et bien. J'avais remarqué que dans une fonction ajax je ne pouvais pas faire de alert(). Il n'affiche jamais rien. En revanche je sais que la fonction rentre bien dans l'une des boucles car les "if" modifient le CSS avec login.classname. Et cela fonctionne parfaitement à ce niveau là. Il y a juste le réponse = true ou false qui n'est pas prit en compte....
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sispheor Messages postés 44 Date d'inscription vendredi 25 mars 2011 Statut Membre Dernière intervention 9 juillet 2012 11
Modifié par sispheor le 7/10/2011 à 09:31
J'ai dis une bétise. Le alert (msg) fonctionne tres bien dans la fonction ajax! Et affiche bien 0 quand le pseudo est dispo. Mais reponse reste à sa valeur initialisé et donc false.
0
jojo673 Messages postés 210 Date d'inscription lundi 19 septembre 2011 Statut Membre Dernière intervention 9 avril 2014 44
7 oct. 2011 à 09:38
Peut-être que le problème viens du fait que toute la fonction est exécuter avant que l'AJAX n'est eu le temps de s'exécuter, c'est à dire la variable retour contient false au début, toute la fonction est parcourut, on arrive à l'ajax qui commence l'execution, on arrive au return retour; et une fois l'ajax terminé il enregistre la valeur retourné dans la variable retour.
Je ne connais pas très bien cette méthode pour utiliser l'ajax, mais je sais que normalement on peut dire que quand l'ajax c'est terminé, alors on retourne la valeur.
0
sispheor Messages postés 44 Date d'inscription vendredi 25 mars 2011 Statut Membre Dernière intervention 9 juillet 2012 11
7 oct. 2011 à 09:43
Et bien merci je vais suivre cette piste. Je posterais la solution si j'en trouve une.
0
Bonjour

Je n'y connais pas grand chose en ajax, mais il me semble que la variable retour est locale dans la fonction check['login'] alors qu'elle est globale dans la fonction function(msg){. Il ne s'agit donc pas de la même variable.
Remplace
var retour = false; //par defaut ..
par
retour = false; //par defaut
0
sispheor Messages postés 44 Date d'inscription vendredi 25 mars 2011 Statut Membre Dernière intervention 9 juillet 2012 11
7 oct. 2011 à 09:58
Non ce n'est pas ça. Mais merci pour cette réponse. C'est jojo qui a raison. Avec différent alert je viens de me rendre compte que la fonction se termine avant l'ajax. Il faut donc que je trouve le moyen d'attendre que le ajax réponde avant que la fonction renvoi la réponse. Pour info jojo j'utilise un plugin jquery pour faire de l'ajax.
0
jojo673 Messages postés 210 Date d'inscription lundi 19 septembre 2011 Statut Membre Dernière intervention 9 avril 2014 44
7 oct. 2011 à 10:09
Pourquoi ne pas mettre les instructions directement dans la fonction success: function.. ?
0
C'est vrai qu'il ne suffit pas de rendre 'retour' globale pour que ça marche, si ton ajax est exécuté en asynchrone. Mais je crois quand même que ma remarque sur le fait que tu as deux variables retour différentes, une locale et l'autre globale, reste valable. À vérifier quand tu auras trouvé le moyen d'attendre la réponse d'ajax.
0
si j'en crois, http://www.w3schools.com/jquery/ajax_ajax.asp, il suffit d'ajouter async:false dans ton appel à ajax pour le rendre synchrone, et ainsi attendre la fin de son exécution avant de passer à la suite
0
jojo673 Messages postés 210 Date d'inscription lundi 19 septembre 2011 Statut Membre Dernière intervention 9 avril 2014 44
7 oct. 2011 à 10:21
*Le rendre non-asynchrome.
C'est une solution, mais parcontre la navigation sera bloqué jusqu'à la réponse de l'ajax.
0
ben oui, c'est même ça la définition du synchrone...
0
jojo673 Messages postés 210 Date d'inscription lundi 19 septembre 2011 Statut Membre Dernière intervention 9 avril 2014 44
7 oct. 2011 à 13:02
Ah pardon j'avais crus voir un "a" :)
0
sispheor Messages postés 44 Date d'inscription vendredi 25 mars 2011 Statut Membre Dernière intervention 9 juillet 2012 11
Modifié par sispheor le 7/10/2011 à 10:32
C'est bon ça marche!Le père à raison il faut passer le async en false (par défaut il est en true). Du coup la fonction attend la réponse et tout roule.
Cependant jojo a raison également la navigation est bloquée le temps de la requête. Il vaut mieux ne pas avoir une grosse base de données à consulter.
En gros il fallait lire ce $ù%*^£ de manuel!! RTFM quoi.
Merci beaucoup pour vos réponses!!!
0