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 :

Comportement fonctions imbriquées avec appel à Xmlhttprequest


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Comportement fonctions imbriquées avec appel à Xmlhttprequest
    Bonjour,
    je vous écris aujourd'hui pour savoir si du monde peut repondre à cette question :
    que se passe t'il lorsqu'une fonction appelle un objet xmlhttprequest, et sur la reponse de cette requete, appelle une nouvelle function qui fait aussi appel à un objet xmlhttprequest.

    Pour le moment, ma premiere fonction marche correctement, c'est à dire que dans la fonction de onreadystatechange, toutes mes fonctions sont correctement appellées, mais dans la fonction de la fonction qui fait une requete xmlhttprequest, cette derniere ne recoit pas le résultat du servuer.

    Plus clair : un schéma general :
    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
     
    function 1 ()
    {
        //onsuppose ok la creation de l'objet et l'envoi des données au serveur    
        xhttpreq.onreadystatechange = function () 
        {
            if(xhttpreq.readyState == 4 && xhttpreq.status == 200)
            function 2 ()
            function 3 ()
        }
    }
     
    function 2 ()
    {
        xhttpreq.onreadystatechange = function ()
        {
             if(xhttpreq.readyState == 4 && xhttpreq.status == 200)
             alert ("function 2");
        }
    }
     
    function 3 ()
    {
        alert ("function 3");
     
    }
    Ce schéma ci dessus affichera "function 3" mais pas "function 2" sous firefox, mais "function 2" puis "function 3" sous IE.

    Merci beaucoup
    Gabriel

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Salut !

    ici tes fonctions ne servent pas à grand chose... tu voudrais pas plutôt nous mettre le code concret ?

    sinon, si FF n'affiche pas fonction 2, c'est parce que il considère bien onreadystatechange comme un évènement qui se déclenche ponctuellement

    alors que IE transmet le déclenchement tant que l'objet vérifie les conditions...

    de ce fait, il te faudrait lancer une autre requête dans function 2() pour que se lance le onreadystatechange ...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    Rédacteur
    Avatar de MasterOfChakhaL
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2004
    Messages
    2 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 147
    Points : 3 264
    Points
    3 264
    Par défaut
    de plus, tu travaille toujours, sur le meme objet xhttpreq dont tu redéfinit la propriété 'onreadystatechange' dans le corps de ta fonction 2...

    ca peut poser probleme je pense...
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    N'oubliez pas de cliquer sur quand votre question à trouvé une solution.

    Si vous n'avez pas encore lu les règles du club, mieux vaut tard que jamais!

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    C'est vrai qu'avec du code concret, c'est plus simple.
    Les deux choix que vous me proposez sont deja pris en compte depuis le départ, et c'est juste dans mon exemple que je ne les ai pas fait resortir.

    Donc mon objet xmlhttprequest est recrée dans une fonction getXhr () :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function getXhr(){
    	if(window.XMLHttpRequest) // Firefox et autres
    		xhr = new XMLHttpRequest(); 
    	else if(window.ActiveXObject){ // Internet Explorer 
    		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;
    }
    Ensuite dans mes appels de fonctions imbriques :

    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
     
    function ChangeDebSim ()
    {
            //plein de code ne servant à rien pour indiquer le probleme
            xhr = getXhr ();
     
    	xhr.onreadystatechange = function(){
    		if(xhr.readyState == 4 && xhr.status == 200)
                           xhr.responseXML.getElementsByTagName("select");
                           //traitement divers
                           function ChangeSucreEau ();
                           function ChangePmsfrdeb ();
                    }
            xhr.open("POST","../Php/Requete.php",true);
    	xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
            xhr.send( //liste d'arguments);
    }
     
    function ChangeSucreEau ()
    {
            xhr = getXhr ();
     
            xhr.onreadystatechange = function(){
    		if(xhr.readyState == 4 && xhr.status == 200){
                           xhr.responseXML.getElementsByTagName("option");
                           functionautre ();
                     }
                     else message de debug (voir plus bas)
             }
             xhr.open("POST","../Php/Requete.php",true);
     
    	xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    	xhr.send(//liste argument);
    }
     
    function ChangePmsfrdeb ()
    {
            xhr = getXhr ();
     
            xhr.onreadystatechange = function(){
    		if(xhr.readyState == 4 && xhr.status == 200){
                         xhr.responseXML.getElementsByTagName("option");
                    }
            }
    	xhr.open("POST","../Php/Requete.php",true);
    	xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
     
    	xhr.send("//listeargument);
    }
    L'appel commence par changedebsim (), et sous firefox, la fonction onreadystatechange de ChangeSucreEau () n'est jamais traitée. Une belle exception est ratrappée par javascript :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Error: [Exception... "Component returned failure code: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.status]"  nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)"  location: "JS frame :: http://Js/function.js :: anonymous :: line 434"  data: no]
    Source File: http://Js/function.js
    Line: 434
    A cette ligne la je suis dans la fonction ChangeSucreEau et je fais un message de debug :
    DEBUG ("SUCREEAU : PAS READY : readyState=" + xhr.readyState + " et status : " + xhr.status);


    ....maintenant, comment faire marcher ceci sous firefox.. pour le moment mystere.

    Merci des réponses du dessus
    Gabriel

  5. #5
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Cela vient du fait que tu remplaces xhr sans lui laissé le temps d'arriver au bout...

    tu devrais prévoir trois objets XMLHTTPREQUEST différent (trois variables xhr1, 2 et 3 et trois fonction getXhr() différentes )
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  6. #6
    Membre averti
    Profil pro
    à la bougie alors
    Inscrit en
    Mai 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : à la bougie alors

    Informations forums :
    Inscription : Mai 2006
    Messages : 224
    Points : 362
    Points
    362
    Par défaut
    Essayez de remplacer
    où xhr est vu comme une variable globale au script et donc
    Citation Envoyé par Swoög
    Cela vient du fait que tu remplaces xhr sans lui laissé le temps d'arriver au bout...
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var xhr = getXhr ();
    dans toutes vos fonctions

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Humpf..... je m'etais justement demandé si ce ne pouvait etre un probleme de portée, et c'est pour ca que juste avant de reposter le code de getXhr, j'ai changé ma methode :
    A la place d'avoir une variable globale :
    var xhr = null, que je remplissais a chaque appel de getXhr, j'ai tenté de lui faire creer un nouvel objet à chaque fois.

    Maintenant, j'ai écouté ton conseil (heureusement, c'est pour ca aussi que j'ai posté tiens donc ) et j'ai jeté un coup d'oeil sur les portées des variables en javascript.

    Petit extrait du premier site sur lequel je suis tombé :
    Lorsqu'une variable est déclarée sans le mot clé var, c'est-à-dire de façon implicite, elle est accessible de partout dans le script (n'importe quelle fonction du script peut faire appel à cette variable). On parle alors de variable globale

    La portée d'une variable déclarée de façon explicite (précédée du mot-clé var), dépend de l'endroit où elle est déclarée.

    * Une variable déclarée au début du script, avant toute fonction, sera globale. Elle peut être utilisée n'importe où dans le script .
    * Une variable déclarée explicitement dans une fonction aura une portée limitée à cette seule fonction, c'est-à-dire qu'elle est inutilisable ailleurs. On parle alors de « variable locale ».
    Encore merci pour ta réponse, car en plus de me debloquer totalement ceci (il y a encore quelques fonctions qui sont imbriquées les unes aux autres...), ca me permet de fixer un point de connaissance indispensable : la portée des variables.

    A bientot j'espere, et c'est avec joie que je peux cliquer sur le bouton résolu.

    Gabriel

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

Discussions similaires

  1. [XL-2003] Fonction imbriqué ou appel d'une fonction dans une autre
    Par ines09 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/02/2013, 19h32
  2. Réponses: 3
    Dernier message: 13/04/2010, 16h13
  3. [PHP][Javascript] PB avec appel de fonctions externes, HELP!
    Par chaser_T dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/04/2006, 16h44
  4. [FLASH 8] Pb avec appel de fonction
    Par php_de_travers dans le forum Flash
    Réponses: 1
    Dernier message: 15/11/2005, 19h44
  5. Réponses: 8
    Dernier message: 13/08/2004, 12h32

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