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 :

Undefined avec return


Sujet :

JavaScript

  1. #1
    Membre régulier Avatar de kryogen
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 140
    Points : 107
    Points
    107
    Par défaut Undefined avec return
    Bonjour,

    mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function inserer_utilisateur(nom_table,prefixe_table,num)
    {
    var data_form = '';
    data_form = recuperer_data(nom_table,prefixe_table,num);
    alert(data_form);
    }
    et

    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
     
    function recuperer_data(nom_table,prefixe_table,num)
    {
    // récupérer les données pour les insérer dans un formulaire
     
        xhr.open('POST','./../php/script_recuperer_data.php',true);
        xhr.onreadystatechange = function()
            {
                if ((xhr.readyState == 1)||(xhr.readyState == 2)||(xhr.readyState == 3))
                {
                }
                else if (xhr.readyState == 4)
                {
                    // si erreur session utilisateur
     
                    if (xhr.responseText == 'erreur_utilisateur')
                    {
                        parent.document.location.href=<?php echo '\'http://'.$_SERVER['HTTP_HOST'].'\''; ?>;
                    }
                    else
                    {
                    }
     
                    data_form = xhr.responseText;
                    return data_form;
                }
            }
        xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded');
        var data = 'nom_table='+escape(nom_table)+'&prefixe_table='+escape(prefixe_table)+'&num='+escape(num);
        xhr.send(data);
    }
    mon souci c'est que dans la première fonction, le "alert" me renvoie "undefined". Et je ne vois pas pourquoi ?
    Qu'ai-je fait de mal ?
    Pour info, j'ai testé "xhr.responseText" qui me renvoi bien la valeur voulue.

    Merci !

  2. #2
    Membre émérite Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Points : 2 953
    Points
    2 953
    Par défaut
    Salut,

    En fait, tu fais la chose à l'envers. Tu oublies que tu fais de l'Ajax et qu'il y a un caractère asynchrone. La première fonction exécute la seconde, mais affiche l'alerte avant d'attendre sa réponse. Il faut en fait exécuter la seconde fonction ayant la première comme callback. Voici un exemple :
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
       <title>modèle de test pour les applications ajax</title>
       <meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
       <style type="text/css">
       </style>
    </head>
    <body>
      <div id="json"></div>
      <script type="text/javascript">
      var FC = {
        Ajax: {
          requete: function() {
            if(window.XMLHttpRequest) { return new XMLHttpRequest(); }
            else if(window.ActiveXObject) { return new ActiveXObject("Microsoft.XMLHTTP"); }
            else { return false; }
          }(),
          obtenir: function(typeDeReponse, source, fonction) {
            var requete = FC.Ajax.requete;
            if(!requete) { return false; }
            requete.onreadystatechange = function() {
              if(requete.readyState===4 && requete.status===200) {
                if(fonction) {
                  if(typeDeReponse==="xml") { 
                    fonction(FC.DOM.nettoyerDocument(requete.responseXML.documentElement)); 
                  } else { fonction(requete.responseText); }
                }
              }
            }
            requete.open("GET", source, true);
            requete.send(null);
          }
        },
        DOM: {
          nettoyerDocument: function(xmldoc) {
            var elements = xmldoc.getElementsByTagName("*");
            for(var i=0, imax=elements.length; i<imax; i++){
              var frerePrecedent = elements[i].previousSibling;
              var frereSuivant = elements[i].nextSibling;
              if(frerePrecedent && frerePrecedent.nodeType===3) { FC.DOM.nettoyerNoeud(frerePrecedent); }
              if(frereSuivant && frereSuivant.nodeType===3) { FC.DOM.nettoyerNoeud(frereSuivant); }
            }
            return xmldoc;
          },
          nettoyerNoeud: function(element) {
            if(!element.data.replace(/\s/g,'')) { element.parentNode.removeChild(element); }
          }
        }
      }
      /*FC.Ajax.obtenir("xml", "xml.xml", function(xmldoc) {
        var contenu = xmldoc.getElementsByTagName("film")[0].childNodes[1];
        alert(contenu.data);
      });
      */
      FC.Ajax.obtenir("text", "json.txt", function(json) {
        var obj = document.createElement("script");
    		obj.setAttribute("type", "text/javascript");
    		obj.text = "var o = "+ json +";";
    		document.getElementById("json").appendChild(obj);	       
        alert(o[1].p1);
      });
      </script>
    </body>
    </html>
    avec json.txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [{p1:"blah",p2:"bleh"},{p1:"blih",p2:"bloh"}]

  3. #3
    Membre régulier Avatar de kryogen
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 140
    Points : 107
    Points
    107
    Par défaut
    ah ouai d'accord ! j'ai pigé le truc. Bon par contre ton exemple est trop obscure pour moi. J'ai pas encore ce niveau.
    Je vais voir ce que je peux faire...

  4. #4
    Expert éminent sénior

    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
    Points : 36 571
    Points
    36 571
    Par défaut
    Bonjour,
    comme l'a dit franculo_caoulene, il faut faire ton alert() à la réception de la réponse :
    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
        xhr.onreadystatechange = function()
            {
                if (xhr.readyState == 4)
                {
                    // si erreur session utilisateur
                    
                    if (xhr.responseText == 'erreur_utilisateur')
                    {
                        parent.document.location.href=<?php echo '\'http://'.$_SERVER['HTTP_HOST'].'\''; ?>;
                    }
                    
                    data_form = xhr.responseText;
                    alert(data_form);
                    return data_form;
                }
            }
    Et ce n'est pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    parent.document.location.href
    mais "location" est une propriété de l'objet "window" ("parent" est un objet de type "window") et non "document"

    EDIT : et pas besoin de tester les valeur de readyState différentes de 4.
    En plus je crois que ça plante dans certains nav' ....

    A+

  5. #5
    Membre régulier Avatar de kryogen
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 140
    Points : 107
    Points
    107
    Par défaut
    ok pour le alert() dans la première fonction.
    Mais ce qui m'intéresse, c'est récupérer les données pour les traiter dans la deuxième fonction. Le alert() me permettait de tester si les données étaient transmises à la deuxième fonction.
    merci

  6. #6
    Expert éminent sénior

    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
    Points : 36 571
    Points
    36 571
    Par défaut
    Citation Envoyé par kryogen Voir le message
    Mais ce qui m'intéresse, c'est récupérer les données pour les traiter dans la deuxième fonction.
    Non : c'est ta méthode qui n'est pas bonne.
    Ce que tu voulais faire dans inserer_utilisateur() il faut que tu le fasses dans le onreadystatechange.
    Ou alors tu passes ton Ajax en synchrone ...

    A+

  7. #7
    Membre régulier Avatar de kryogen
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 140
    Points : 107
    Points
    107
    Par défaut
    ok j'ai bien compris.
    bon bah je vais faire les choses dans l'ordre alors !
    merci !

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

Discussions similaires

  1. Problème avec return
    Par sydius dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 15/07/2008, 11h35
  2. thread avec return dans une boucle
    Par Tanebisse dans le forum Général Java
    Réponses: 19
    Dernier message: 19/05/2008, 17h42
  3. Retour paramètres avec Return
    Par Basicnav dans le forum C
    Réponses: 8
    Dernier message: 25/04/2008, 11h25
  4. this.form retourne undefined avec <a>
    Par Tchupacabra dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 11/03/2007, 09h51
  5. Problème avec return
    Par Rémiz dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 25/08/2005, 17h15

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