IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

[AJAX] AJAX ASYNCHRONE incompréhensible


Sujet :

JavaScript

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut [AJAX] AJAX ASYNCHRONE incompréhensible
    Bonjour à tous, felicitations pour ce forum plein de bonnes choses..

    Je vous explique mon problème, un vrai casse tête...

    Je souhaite effectuer en Ajax une vérification de mon formulaire. Jusqu'a aujourd'hui tout allait bien, mais j'avais définit la requête en false, donc, synchrone.
    Comme le script va chercher dans ma BDD tous les pseudos des visiteurs, pour verifier que le pseudo entré n'est pas déjà utilisé, pareil pour les emails, l'écran reste figé, ce qui risque de faire fuir tout le monde..

    J'aimerai donc mettre le script en mode asynchrone, mais là .. PLUS RIEN..
    Je suis resté 24 h d'affilée dessus (je suis insomniaque), et je n'ai toujours pas trouvé la solution, pourtant je suis bon en Google...

    Je vais donc vous donner simplement le script javascript correspondant au champ "pseudo" qui me pose problème, et je vous donnerai ensuite la version synchrone fonctionnelle.

    Si vous ne me répondez pas tout de suite, c'est pas grave, j'ai préparé une corde

    Voici le code qui ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
     
    function writediv(texte)
     
    {
    document.getElementById('validpseudo').innerHTML = texte;
    }
     
    function verifPseudo(pseudo)
    {
    	if(pseudo != '')
    	{
    		if(texte = file('inc/verifpseudo.php?pseudo='+escape(pseudo)))
    		{
    			if(pseudo.length<3)
    				writediv('<img src="style/images/gif/invalide.gif"/><div style="color:red;text-align:center;">Ce Pseudonyme semble trop court. Veuillez entrer au moins 3 caractères svp.</div>');
    			else if(texte == 0)
    				writediv('<img src="style/images/gif/valide.gif"/>');
    			else if(texte == 1)
    				writediv('<img src="style/images/gif/invalide.gif"/><div style="color:red;text-align:center;">Pseudo indisponible</div>');
    			else if(texte == 2)
    				writediv('<img src="style/images/gif/invalide.gif"/><div style="color:red;text-align:center;">Ce Pseudonyme ne semble pas valide, seuls ces caractères spéciaux: "<strong> _ - . </strong>" sont acceptés.</div>');
     
    		}
    	}
     
    }
     
     
     
    function file(fichier)
    {
    if(window.XMLHttpRequest) // FIREFOX
    xhr_object = new XMLHttpRequest();
    else if(window.ActiveXObject) // IE
    xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
    else
    return(false);
     
    xhr_object.open('GET',fichier,true);
    xhr_object.send(null);
        xhr_object.onreadystatechange = function()
            {
            if (xhr_object.readyState == 4)
                {
    			return(xhr_object.responseText);
    			}
     
    		}
    }

    Je vous explique rapidement le principe :

    La valeur du champs "pseudo" est récupérée par javascript, envoyée par GET à verifpseudo.php?pseudo=... ,

    La page verifpseudo.php traite la valeur avec une regex pour verifier que le format est valide, puis va chercher dans la bdd les pseudos similaires.

    Elle renvoie en echo "0" si le pseudo est valide et qu'il n'existe pas, "1" s'il est valide mais qu'elle existe, "2" s'il est syntaxiquement incorrect.

    Le script javascript verifie egalement que le pseudo n'est pas trop court, et enfin il ecrit dans une div de la page un message d'erreur correspondant, ou une petite icone pour montrer qu'il est valide.



    J'espere que vous avez tout compris.

    Voici enfin le code qui fonctionnait mais qui fige l'écran :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    function writediv(texte)
    {
    document.getElementById('validpseudo').innerHTML = texte;
    }
     
    function verifPseudo(pseudo)
    {
    	if(pseudo != '')
    	{
    		if(texte = file('inc/verifpseudo.php?pseudo='+escape(pseudo)))
    		{
    			if(pseudo.length<3)
    				writediv('<img src="style/images/gif/invalide.gif"/><div style="color:red;text-align:center;">Ce Pseudonyme semble trop court. Veuillez entrer au moins 3 caractères svp.</div>');
    			else if(texte == 0)
    				writediv('<img src="style/images/gif/valide.gif"/>');
    			else if(texte == 1)
    				writediv('<img src="style/images/gif/invalide.gif"/><div style="color:red;text-align:center;">Pseudo indisponible</div>');
    			else if(texte == 2)
    				writediv('<img src="style/images/gif/invalide.gif"/><div style="color:red;text-align:center;">Ce Pseudonyme ne semble pas valide, seuls ces caractères spéciaux: "<strong> _ - . </strong>" sont acceptés.</div>');
     
    		}
    	}
     
    }
     
     
     
    function file(fichier)
    {
    if(window.XMLHttpRequest) // FIREFOX
    xhr_object = new XMLHttpRequest();
    else if(window.ActiveXObject) // IE
    xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
    else
    return(false);
    xhr_object.open("GET", fichier, false);
    xhr_object.send(null);
    if(xhr_object.readyState == 4) return(xhr_object.responseText);
    	else 
    	return(false);
    }

    Voila. Après de (très) nombreux essais, j'ai remarqué par exemple qu'en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(xhr_object.responseText);
    au lieu de return() , j'obtenais dans la fenetre d'erreur la réponse PHP (0,1,2).

    Le script va donc correctement chercher les infos... mais ne veut plus les afficher dans la div...

    Tiens ça me donne envie de pleurer tout ça...

    Bon bah euh... Bon courage


    Dim.

  2. #2
    Membre expérimenté Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Points : 1 388
    Points
    1 388
    Par défaut
    C'est normal, tu ne peux pas faire de return dans ton handler onreadystatechange.

    Faut que tu mettes ton traitement dans la fonction, donc ca, c'est impossible ^^
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    		if(texte = file('inc/verifpseudo.php?pseudo='+escape(pseudo)))
    		{
    			if(pseudo.length<3)
    				writediv('<img src="style/images/gif/invalide.gif"/><div style="color:red;text-align:center;">Ce Pseudonyme semble trop court. Veuillez entrer au moins 3 caractères svp.</div>');
    			else if(texte == 0)
    				writediv('<img src="style/images/gif/valide.gif"/>');
    			else if(texte == 1)
    				writediv('<img src="style/images/gif/invalide.gif"/><div style="color:red;text-align:center;">Pseudo indisponible</div>');
    			else if(texte == 2)
    				writediv('<img src="style/images/gif/invalide.gif"/><div style="color:red;text-align:center;">Ce Pseudonyme ne semble pas valide, seuls ces caractères spéciaux: "<strong> _ - . </strong>" sont acceptés.</div>');
     
    		}
    La bonne méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if(xhr_object.readyState == 4){
         var texte = xhr.responseText;
         if(texte == 0)
     	 writediv('<img src="style/images/gif/valide.gif"/>');
         else if(texte == 1)
    	 writediv('<img src="style/images/gif/invalide.gif"/><div style="color:red;text-align:center;">Pseudo indisponible</div>');
         else if(texte == 2)
    	writediv('<img src="style/images/gif/invalide.gif"/><div style="color:red;text-align:center;">Ce Pseudonyme ne semble pas valide, seuls ces caractères spéciaux: "<strong> _ - . </strong>" sont acceptés.</div>');
    }

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Problème resolu
    T'es mon idole !!

    Bon bah voilà j'avais dejà essayé cette solution (j'avais gardé la copie de tous mes scripts) sauf que j'avais fait une faute de frappe... la même que toi : mon objet xhr s'appelle xhr_object

    Conclusion : ne luttez pas contre le sommeil

    Merci DoubleU !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AJAX] Ajax requete asynchrone multiple
    Par locs dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/05/2008, 19h02
  2. Struts/Ajax: Submit asynchrone
    Par MedMek dans le forum Struts 1
    Réponses: 1
    Dernier message: 03/04/2008, 16h36
  3. [AJAX] Ajax requêtes asynchrones simultanées
    Par jiber2fr dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/07/2007, 23h39
  4. [AJAX] AJAX Asynchrone ne fonctionne pas
    Par linar009 dans le forum Général JavaScript
    Réponses: 23
    Dernier message: 16/03/2007, 10h11
  5. [AJAX] Ajax pas asynchrone
    Par crazy dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 11/03/2007, 18h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo