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 :

XMLHttpRequest comportement étrange..


Sujet :

JavaScript

  1. #1
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut XMLHttpRequest comportement étrange..
    Bonjour,

    J'ai un comportement étrange lors d'une requête vers un serveur via XMLHttpRequest.

    En fait lors de la première requête, la trame de data reçue est correcte, mais la variable "rec" (qui stocke les données reçue) et vide(?)
    Je relance la requête et là tout est OK.
    C'est comme si 'alert(rec) était réalisée avant la fin du chargement de la variable tmp.
    J'ai bon chercher je comprend plus rien.....

    J'utilise les data pour remplir des listbox qui se trouvent du coup vide.
    Cette fonction CPnewprj est appelée sur un événement "onclick"

    Un coup de pouce serait bienvenue.

    Merci
    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
     
    function CPnewprj() { 
     var request_methode="POST";                    
    	var target_url="/cgi-bin/CPts";
    	var xhr_object = null;                         
    	if(window.XMLHttpRequest)                     
    		xhr_object = new XMLHttpRequest();
    	else if(window.ActiveXObject)                 
    		xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
    	else {                                        
    		alert("Your browser does not support XMLHttpRequest, you must use Internet explorer or Mozilla Firefox.");
    		return;
    	} 
    	xhr_object.open(request_methode, target_url, true);     
    	xhr_object.setRequestHeader('Content-Type','text/html');
    	xhr_object.send('rien');
    	xhr_object.onreadystatechange = function() {   
    		if(xhr_object.readyState == 4 && xhr object.status==200){            
    			var tmp = xhr_object.responseText;
    		}
    	}
    var rec=tmp.replace(/\s/gi,"");      
    alert('record : '+rec);

  2. #2
    Membre expérimenté Avatar de nod__
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Par défaut
    normal, tu as un problème de portée. tmp est locale à ta fonction callback. Il faut la déclarer en dehors.

    Dans un monde idéale il faut définir onreadystatechange avant le xhr.send()


  3. #3
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    Bonjour,

    Un oubli de précision ma part, la variable tmp est bien déclarée en globale.
    J'ai mis la déclaration du "xhr_object.send('rien');" à la fin , mais même punition.

    J'ai ajouté un alert(tmp), j'ai bien mes data dans tmp,mais rien dans rec (??).
    (La première fois uniquement. Un second appel de la fonction et tout est Ok.)

    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 CPnewprj() { 
     var request_methode="POST";                    
    	var target_url="/cgi-bin/CPts";
    	var xhr_object = null;                         
    	if(window.XMLHttpRequest)                     
    		xhr_object = new XMLHttpRequest();
    	else if(window.ActiveXObject)                 
    		xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
    	else {                                        
    		alert("Your browser does not support XMLHttpRequest, you must use Internet explorer or Mozilla Firefox.");
    		return;
    	} 
    	xhr_object.open(request_methode, target_url, true);     
    	xhr_object.setRequestHeader('Content-Type','text/html');
     
    	xhr_object.onreadystatechange = function() {   
    		if(xhr_object.readyState == 4 && xhr object.status==200){            
    			var tmp = xhr_object.responseText;
                            alert(tmp);
    		}
    	}
    	xhr_object.send('rien');
    var rec=tmp.replace(/\s/gi,"");      
    alert('record : '+rec); 
    }

  4. #4
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Citation Envoyé par SPACHFR Voir le message
    ... la variable tmp est bien déclarée en globale.
    peut-être mais tu la redéfinis en locale au moment de l'assignation :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    var tmp = xhr_object.responseText;
    >>> ce qui explique que :
    Citation Envoyé par SPACHFR Voir le message
    j'ai bien mes data dans tmp,mais rien dans rec (??)
    ^^
    (retire le "var" et ça ne sera plus qu'une assignation classique, donc ton rec recevra la bonne valeur...)

  5. #5
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Salut tu dois affecter la valeur de rec dans le xhr_object.onreadystatechange car sa valeur est affectée avant le résultat du requête AJAX.
    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
    var tmp;
    var rec;
    function CPnewprj() { 
     var request_methode="POST";                    
    	var target_url="/cgi-bin/CPts";
    	var xhr_object = null;                         
    	if(window.XMLHttpRequest)                     
    		xhr_object = new XMLHttpRequest();
    	else if(window.ActiveXObject)                 
    		xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
    	else {                                        
    		alert("Your browser does not support XMLHttpRequest, you must use Internet explorer or Mozilla Firefox.");
    		return;
    	} 
    	xhr_object.open(request_methode, target_url, true);     
    	xhr_object.setRequestHeader('Content-Type','text/html');
     
    	xhr_object.onreadystatechange = function() {   
    		if(xhr_object.readyState == 4 && xhr object.status==200){            
    			tmp = xhr_object.responseText;
                alert(tmp);
    			rec=tmp.replace(/\s/gi,"");      
    			alert('record : '+rec);
    		}
    	}
    	xhr_object.send('rien');
    }

  6. #6
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    Bonne remarque pour var tmp, mais toujours pareil (??)


    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
     
     
    function CPnewprj() { 
     var request_methode="POST";                    
    	var target_url="/cgi-bin/CPts";
    	var xhr_object = null;                         
    	if(window.XMLHttpRequest)                     
    		xhr_object = new XMLHttpRequest();
    	else if(window.ActiveXObject)                 
    		xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
    	else {                                        
    		alert("Your browser does not support XMLHttpRequest, you must use Internet explorer or Mozilla Firefox.");
    		return;
    	} 
    	xhr_object.open(request_methode, target_url, true);     
    	xhr_object.setRequestHeader('Content-Type','text/html');
    	xhr_object.send('rien');
    	xhr_object.onreadystatechange = function() {   
    		if(xhr_object.readyState == 4 && xhr object.status==200){            
    			tmp = xhr_object.responseText;
    		}
    	}
    var rec=tmp.replace(/\s/gi,"");      
    alert('record : '+rec);

  7. #7
    Membre expérimenté Avatar de nod__
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Par défaut
    andry.aime a ta réponse

    Ça ou tu fais ta requete en mode synchrone.

  8. #8
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    As tu essayé ma proposition?
    Mais avec ton code, tu peux aussi travailler en mode synchrone.

  9. #9
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    Je viens de tester la suggestion de andry.aime, cela fonctionne !
    J'ai bien mes data à chaque fois
    Du coup j'ai mis rec en global.


    Par contre je comprend pas pourquoi cette solution marche et pas ce que j'avais fais ?

    Une petite précision serait sympa.


  10. #10
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Par contre je comprend pas pourquoi cette solution marche et pas ce que j'avais fais ?
    Salut tu dois affecter la valeur de rec dans le xhr_object.onreadystatechange car sa valeur est affectée avant le résultat du requête AJAX.
    Mais ton code doit foctionner si tu travailles en mode synchrone.

  11. #11
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    J'ai crié victoire trop vite, même Pb

    Mode synchrone je vais tester...

  12. #12
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    Je sais pas si c'est correctement codé pour du synchrone mais pas mieux, j'ai plus rien (?). Pourtant je suis sur de mes data, j'ai fais une trace avec HttpWatch et tout est là....

    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
     
    function CPnewprj() { 
     var request_methode="POST";                    
    	var target_url="/cgi-bin/CPts";
    	var xhr_object = null;                         
    	if(window.XMLHttpRequest)                     
    		xhr_object = new XMLHttpRequest();
    	else if(window.ActiveXObject)                 
    		xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
    	else {                                        
    		alert("Your browser does not support XMLHttpRequest, you must use Internet explorer or Mozilla Firefox.");
    		return;
    	} 
    	xhr_object.open(request_methode, target_url, false);     
    	xhr_object.setRequestHeader('Content-Type','text/html');
    	xhr_object.send('rien');   
    	if(xhr_object.readyState == 4 ) {            
    		tmp = xhr_object.responseText;
    	}
    var rec=tmp.replace(/\s/gi,"");      
    alert('record : '+rec);
    Voici les data envoyés par le CGI
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    2009020122302009030303000144702028
    :XA231-XA231;XA241-MA0;:XA231-EZ01;XA231-GZ01;XA231-IZ01;XA231-KD01;XA231-KV01;XA231-KW02;XA231-OZ01;XA231-PZ01;XA231-QZ01;XA231-YA02;XA231-ZA05;XA231-ZS02;XA231-ZT02;XA241-CZ01;XA241-HZ01;XA241-KC01;XA241-KS01;XA241-KV01;XA241-KW01;XA241-KY01;XA241-MZ01;XA241-SZ01;XA241-UZ01;XA241-VZ01;XA241-YA01;XA241-ZA01;XA241-ZS01;XA241-ZT01;

  13. #13
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    J'avais eu le même genre de problème en essayant de m'écrire une fonction générique d'appel ajax : marcha et bovino m'avaient bien aidé, et comme ça répond (entre autres) à ton problème de portée de fonction et de callback ajax... ^^

    >>> c'est ici

  14. #14
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    Merci pour ce dernier lien, je vais approfondir car même si j'ai trouvé une solution de contournement, j'aimerais bien savoir pourquoi cela ne fonctionne pas.

    Pour info, j'ai coupé ma fonction en deux :
    Une pour l'appel Ajax
    Une pour le traitement des données

    Comme ça j'ai mes données à tout les coup

    MERCI à tout ceux qui m'ont suggérés des alternatives.



    PS: le ne met pas le tag "RESOLU" tout de suite juste au cas ou quelqu'un aurait une explication sur ce type de problématique
    (j'attend un peu)

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

Discussions similaires

  1. Comportement étrange XMLHttpRequest
    Par nolev3 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 29/09/2008, 18h40
  2. Comportement étrange apres une désinstallation
    Par Sunchaser dans le forum Excel
    Réponses: 4
    Dernier message: 06/08/2005, 19h44
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 21h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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