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] Vérification instantanée sur un champ


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Par défaut [AJAX] Vérification instantanée sur un champ
    Bonjour

    Avant tout je tiens à préciser que j'ai voulu faire la recherche sur le forum si ce post existait déjà mais la recherche a bugué x). Bref.

    Dans un champ de type text, j'ai soit une chaine de type "aaaa" soit un mail.

    Quand l'utilisateur tape quelque chose dans ce champ, j'aimerai faire un contrôle instantané pour savoir si ce qui est tapé existe déja dans la base ou pas.
    S'il n'existe pas : on affiche "disponible", sinon on affiche "pris" dans le div sous ce champ.

    Voici mon code (je n'ai pas mis le html) :

    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
     
    var urlter = "start_ajax.php?Action=cpt&Etape=ajax_dest&recherche=";
    function writediv(texte)
    {
    	document.getElementById('verifbox').innerHTML = texte;
    }
    var rgxvir = /\s*,\s*/;
    var rgxmail = /\s*@\s*/;
    function verifDest() 
    {	  
    	if(dest != '')
    	{
    		if(dest.length<3)
    	              writediv('<span style="color:#cc0000"><b>'+dest+' :</b> cette destination est trop courte</span>');
    	        else if(dest.length>20 && !rgxmail.exec(dest) && !rgxvir.exec(dest))
    	              writediv('<span style="color:#cc0000"><b>'+dest+' :</b> cette destination est trop longue</span>');
    	        else 
    	        {
    	        	writediv('');
    	        	http.open("GET", urlter + escape(dest), true);
    			http.onreadystatechange = handleHttpResponseTer(dest);
    			http.send(null);
    	        }
    	}
    	else writediv('');
    }
     
    function handleHttpResponseTer(dest)
    {
    	if (http.readyState == 4) 
    	{
    	     var responsedest = http.responseText;
    	     if (responsedest == 2)
    	     {
    		writediv('<span style="color:#cc0000"><b>'+dest+' :</b> cette destination est deja prise</span>');
    	     }
    	     else
    	     {
    		writediv('<span style="color:#1A7917"><b>'+dest+' :</b> cette destination est libre</span>');
    	     }
           }
    }
    Et voici la requête SQL qui renvoie 1 ou 2 suivant si ce que l'utilisateur a entré existe ou non.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $ref = $_REQUEST['recherche'];
    $SQLdest = "SELECT destination FROM emails WHERE source LIKE '$ref'";
    $Q = mysql_db_query($SQLdest);
    if(mysql_num_rows($Q)>=1) return 1;
    else return 2;
    Apparement, en response j'obtiens bien un "2" (FireBug qui le dit) mais ça ne fait strictement rien (aucun affichage).
    Donc je ne vois pas ce qui manque/est mal écrit ... Si vous pouviez m'aider =)

  2. #2
    Membre Expert 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
    Par défaut
    Ya deux choses qui ne vont pas, et elles sont au même endroit, sur ton onreadystatechange ^^

    La première: http.onreadystatechange attend une fonction en paramètre. En général on ecrit la fonction juste apres mais on peut également la passer en argument. Le problème dans ta façon de faire, c'est qu'en écrivant http.onreadystatechange = handleHttpResponseTer(dest), tu ne lui files pas une fonction mais le retour de l'exécution de ta fonction. Si tu mets les parenthèses, lui il exécute, donc tu ne retournes pas de fonction.
    Pour suivre ta façon de faire, il aurait fallu écrire http.onreadystatechange = handleHttpResponseTer. Mais ca nous conduit au 2e problème.

    Le callback n'attend pas de paramètre, donc quand ton objet xhr exécute son callback, il ne passe pas de paramètre. Donc forcément, ton traitement ne va pas marcher.

    La solution pour résoudre ton problème: faire une closure sur ton callback pour lui faire retourner une fonction qui aura dans son scope les paramètres que tu veux lui passer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    http.onreadystatechange = function(_dest){
                                   return function(){
                                         alert(_dest);
                                          // ici le traitement que tu voulais exécuter
                                    }(dest)
    }

  3. #3
    Membre éclairé Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Par défaut
    Merci pour ta réponse !

    Par contre je ne suis pas sûre d'avoir bien compris : si je mets ce que tu as dit dans mon "http.onreadystatechange", le traitement que je voulais exécuter correspond à ce que j'avais mis dans ma fonction "function handleHttpResponseTer" ?

    En fait j'ai testé donc en faisant comme ça, mais dans les alert, j'ai des undefined qui apparaissent et ensuite dans mon div j'ai toujours érit : "cette destination est déjà prise".

  4. #4
    Membre Expert 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
    Par défaut
    Par contre je ne suis pas sûre d'avoir bien compris : si je mets ce que tu as dit dans mon "http.onreadystatechange", le traitement que je voulais exécuter correspond à ce que j'avais mis dans ma fonction "function handleHttpResponseTer" ?
    Oui

    En fait j'ai testé donc en faisant comme ça, mais dans les alert, j'ai des undefined qui apparaissent et ensuite dans mon div j'ai toujours érit : "cette destination est déjà prise".
    Désolé, jme suis planté, j'ai pas mis l'appel au bon endroit. Le (dest) doit êtresur la fonction englobante, pas la fonction interne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    http.onreadystatechange = function(_dest){
                                   return function(){
                                         alert(_dest);
                                          // ici le traitement que tu voulais exécuter
                                    }
    }(dest)

  5. #5
    Membre éclairé Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Par défaut
    J'ai fait la modification, comme résultat j'ai ce que j'ai tapé qui s'affiche dans le alert() mais 5 fois o_O. Une fois que j'ai cliqué sur les 5 'Ok' de mes alert, il me dit toujours que la destination est libre. Pourtant, la requête n'a pas l'air fausse :/

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Bonjour,
    Citation Envoyé par baggie Voir le message
    Pourtant, la requête n'a pas l'air fausse :/
    Ben si : il manque pas des caractères génériques, là pour un LIKE :?


    A+

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/04/2011, 13h09
  2. Test de vérification sur deux champs
    Par direct dans le forum Linux
    Réponses: 8
    Dernier message: 28/04/2009, 16h22
  3. [AJAX] Vérification de champs de formulaire
    Par hash95 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 16/01/2008, 09h13
  4. [AJAX] Vérification de champs
    Par boubourse92 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 14/12/2007, 10h41
  5. Vérification de type sur un champ
    Par Niniz dans le forum JSF
    Réponses: 4
    Dernier message: 20/07/2007, 10h28

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