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 :

fonction qui ne retourne rien, comment c'est possible ?


Sujet :

JavaScript

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 57
    Points : 40
    Points
    40
    Par défaut fonction qui ne retourne rien, comment c'est possible ?
    Bonjour à tous,

    je ne comprend pas j'ai une fonction ajax qui est censée me retourner responseText, je suis bien dans la boucle else if(reponse == "return") vu que j'ai l'alert alert(xhr.responseText); qui s'affiche bien.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    fonction Test()
    {
    // du code ...
    else if(reponse == "return")
                            {
                                    alert(xhr.responseText); // AFFICHAGE DE ok
                                    return(xhr.responseText); // on devrait retourner ok
                            }
    }
    pourtant quand je récupère la valeur retournée c'est : undefined

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    alert( Test() ); // AFFICHAGE DE undefined
    je ne vois vraiment pas d'où ca peut venir :'(

  2. #2
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    336
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 336
    Points : 374
    Points
    374
    Par défaut
    Poste tout ton code stp

  3. #3
    Membre actif Avatar de Ikonic
    Inscrit en
    Février 2007
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 197
    Points : 202
    Points
    202
    Par défaut
    salut,

    et si tu déclares une variable ayant pour valeur xhr.responseText ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    fonction Test()
    {
    // du code ...
    else if(reponse == "return")
                            {
                                    alert(xhr.responseText); // AFFICHAGE DE ok
                                    machin = xhr.responseText;
                                    return(machin); // on devrait retourner ok
                            }
    }
    et donc :
    piksite.com
    Pour vos photos, images, .... » Carousel.us

  4. #4
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    336
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 336
    Points : 374
    Points
    374
    Par défaut
    Ici tu déclares une constante, et non pas une variable, d'autre part, c'est quoi l'interêt de faire un return dans ce cas la? Si la valeur retournée est accessible dans le scope global/window aucun intérêt.

    Ce qui ne veut pas dire que c'est une bonne pratique pour autant

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 670
    Points
    66 670
    Billets dans le blog
    1
    Par défaut
    machin est déclarée quelquepart ? avant ? en global ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 57
    Points : 40
    Points
    40
    Par défaut
    voici mon code complet

    J'ai une page php qui execute une fonction ajax EnvoieFormulaire située dans un fichier ajax.js que j'inclu, le problème c'est que je ne recois aucun retour

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    function EnvoieFormulaire(form,page,param,reponse,calque)
    {
            function getXhr()
            {
                    var xhr = null;
                    if(window.XMLHttpRequest) // Firefox et autres
                    xhr = new XMLHttpRequest();
                    else if(window.ActiveXObject)
                    { // Internet Explorer
                            try
                            {
                                    xhr = new ActiveXObject("Msxml2.XMLHTTP");
                            }
                            catch (e)
                            {
                                    xhr = new ActiveXObject("Microsoft.XMLHTTP");
                            }
                    }
                    else
                    { // XMLHttpRequest non supporté par le navigateur
                            alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
                            xhr = false;
                    }
                    return xhr
            }
     
     
            var xhr = getXhr()
            // On défini ce qu'on va faire quand on aura la réponse
            xhr.onreadystatechange = function()
            {
                    // On ne fait quelque chose que si on a tout reçu et que le serveur est ok
                    if(xhr.readyState == 4 && xhr.status == 200)
                    {
                            if(reponse == "alert")
                                    alert(xhr.responseText);
                            else if(reponse == "html")
                                    ChargePage(page, input+textarea+selects+"&"+param, '', '', calque);
                            else if(reponse == "return")
                            {
                                    alert(xhr.responseText); // AFFICHAGE DE OK
                                    return(xhr.responseText); // on devrait retourner ok
                            }
                    }
            }
            xhr.open("POST",page,true);
     
            // Obligatoire pour transmettre des données en POST
            xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
     
     
            if(form != "")
            {
                    formulaire = document.getElementById(form);
     
                    // input
                    var TabInput = formulaire.getElementsByTagName('input');
                    var input ="input=input";
                    for(var i=0; i<TabInput.length; i++)
                    {       if( TabInput[i].type!="checkbox" || TabInput[i].checked == true )
                                    input+= "&"+TabInput[i].name+"="+TabInput[i].value;
                    }
     
                    // textarea
                    var textarea = "";
                    var TabTextarea = formulaire.getElementsByTagName('textarea');
                    for(i=0; i<TabTextarea.length; i++)
                            textarea+= "&"+TabTextarea[i].name+"="+TabTextarea[i].value;
                    textarea = textarea.replace(/\n/gi,"<br />");
     
                    // select
                    var selects = "";
                    var TabSelects = formulaire.getElementsByTagName('select');
                    for(i=0; i<TabSelects.length; i++)
                            selects+= "&"+TabSelects[i].name+"="+TabSelects[i].value;
            }
            else
            {
                    var input ="input=input";
                    var textarea = "";
                    var selects = "";
            }
            // Envoie de toutes les données 
            xhr.send(input+textarea+selects);
    }
    Ici l'alert m'affiche ok

    dans ma page php, une fonction javascript utilise la fonction EnvoieFormulaire et doit récupérer le retour mais j'obtient undefined

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(EnvoieFormulaire(form,'Pages/Login/authentification2.php','','return',''));
    Je ne vois pas du tout d'où ca peut venir :S

  7. #7
    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
    Tu es sûr qu'elle fonctionne ta page Pages/Login/authentification2.php ?
    Si tu tappe l'adresse + param dans la barre d'@ du nav, ça te retourne le résultat attendu ?
    Pour tout savoir sur l'utilisation du forum

    En postant votre message, n'oubliez pas les Règles du Club.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 57
    Points : 40
    Points
    40
    Par défaut
    ma page .php fonctionne très bien vu que l'alert avant le return m'affiche la valeur envoyée par la page php

    EDIT : ca serait possible que reponse = undefined
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var reponse = EnvoieFormulaire(form,"Pages/Login/authentification2.php","","return","");
    car il y a un temps de traitement pour EnvoieFormulaire() ?
    Car j'ai l'impression que l'alert avec ecrit undefined s'affiche légèrement avant que celle de la fonction EnvoieFormulaire avec le message de retour ?

    EDIT2 : je suis partit sur la piste du 1er edit, j'ai donc commenté mon return et le résultat est identique, donc ma question c'est comment faire pour dire que ma fonction n'est pas terminée tant que rien n'est retourné ?

  9. #9
    LEK
    LEK est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Points : 470
    Points
    470
    Par défaut
    Pour moi la fonction qui effectue l'alert dans le cas où var = "response" se déclenche forcément en asynchrone car elle est appelée suivant le statut de la socket que t'apelle xhr...
    De plus c'est une fonction non nommée qui ne correspond pas à la fonction que tu as appelée initialement.

    Tu dois concevoir autrement ton programme afin de ne pas attendre une valeur en retour mais gérer tes actions au niveau de :
    xhr.onreadystatechange = function(){}
    ou alors tu retourne ta variable interne xhr et tu gères à l'extérieur de la fonction suivant son statut...
    ou enconre si tu veux vraiment conserver l'architecture actuelle, tu dois écrire quelquechose du type :
    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
     
    function xx(r){
    var xhr = ...
    var retour = null;
     
     xhr.onreadystatechange = function(){
       if(r == "return"){
         retour = xhr.responseXML;
       }
     }
     
    //boucle d'attente :
     while(retour ==null){}
          return retour;
     
    }
    Bon cela reste schématique, tu devras sans doute faire en sorte de pouvoir sauter la boucle while si elle perdure trop longtemps mais cela te donne une idée du truc

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 57
    Points : 40
    Points
    40
    Par défaut
    LEK, je voudrai utiliser ta derniere solution afin de garder ma structure actuelle

    cependant
    1) j'ai du placer retour en global car retour = xhr.responseXML; est propre à la fonction xhr.onreadystatechange = function(){ et n'etait pas reconnu dans function xx(r){

    2) Mon problème avec ton code c'est que le while s'execute mais n'a pas pour effet une boucle d'attente, en effet il tourne tout seul jusqu'à faire planter le navigateur, cette boucle ne permet pas d'attendre que le status change.
    Donc comment puis-je faire cette temporisation proprement?
    Vaut mieux-t-il abandonner la structure actuelle ?

    sachant qu'à la base j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var reponse = EnvoieFormulaire(form,"Pages/Login/authentification2.php","","return","");
     
    	//alert( reponse );
    	if(reponse == 'ok')
    		return true;
    	else
    		return false;
    donc je ne peux pas retourner xhr afin de traiter a l'exterieure de cette fonction car mon problème se retrouverait a l'exterieur.

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

Discussions similaires

  1. une fonction qui ne retourne rien
    Par blackvicking dans le forum AppleScript
    Réponses: 3
    Dernier message: 07/12/2013, 20h54
  2. Requete SQL qui ne retourne rien alors que ma table n est pas vide
    Par adelsunwind dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/06/2009, 19h16
  3. Requête qui ne retourne rien
    Par afrique dans le forum Administration
    Réponses: 4
    Dernier message: 02/10/2006, 18h19
  4. [MySQL] Requête qui ne retourne rien
    Par baleiney dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/06/2006, 18h29
  5. SELECT qui ne retourne rien à cause d'anti-slash
    Par mikyfpc dans le forum Outils
    Réponses: 8
    Dernier message: 07/08/2005, 23h04

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