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 :

retour d'ajax


Sujet :

JavaScript

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2009
    Messages : 115
    Points : 53
    Points
    53
    Par défaut retour d'ajax
    Bonjour à tous,

    Je suis entrain de créé une application en Ajax et j'ai créer ce code qui fonctionne à moitié, c'est pour ça que je viens vous demander conseil :
    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
     
    manager = {
    	objXMLHttpRequest : null,
     
    	get : function(setting) {
    		objXMLHttpRequest = manager.requestObject();
     
    		if(typeof(setting.mode) == 'undefined' || setting.mode != true || setting.mode != false) {
    			setting.mode = true;
    		}
     
    		if(typeof(setting.json) == 'undefined') {
    			manager.json = false;
    		} else {
    			manager.json = setting.json;
    		}
     
    		objXMLHttpRequest.open('GET', setting.url, setting.mode);
     
    		objXMLHttpRequest.onreadystatechange = function() {manager.response(setting.callBack)};
     
    		objXMLHttpRequest.send(null);
    	},
     
    	response : function(callBack) {
    		if(objXMLHttpRequest.readyState == 4) {
    			if(objXMLHttpRequest.status == 200) {
    				var response = objXMLHttpRequest.responseText;
     
    				if(typeof(manager.json) != 'undefined' && manager.json === true) {
    					response = window["eval"]("(" + response + ")");
    				}
     
    				callBack(response)
    			}
    		}
    	},
     
    	requestObject : function() {
    		return window.XMLHttpRequest ? new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");
    	},
    };
    Grâce à cette classe, je peux effectuer le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    window.onload = function() {
    	var value = manager.get({
    					url : 'http://www.url.com/index.php?params=test',
    					json : true,
    					callBack : function(data) {
    						return data.script;
    					},
    				});
     
    	alert(value)
    }
    Le souci dans ce code, c'est que je fait un retrour de la ligne suivante :

    Que je mets dans la variable "value" mais l'alert ne m'affiche rien (enfin si : undefined). Par contre, il y a bien un texte de retour si vous vous poser la question car lorsque je fait :

    ou

    Dans la méthode "response ()" il y a un retour.

    Avez-vous une idée ?

    Merci d'avance,
    Bien cordialement.

  2. #2
    Membre expérimenté
    Avatar de gwyohm
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 925
    Points : 1 333
    Points
    1 333
    Par défaut
    C'est parce que ta requete ajax n'est pas finie, que déjà tu passes dans ton alert...
    asynchrone

  3. #3
    Membre émérite
    Inscrit en
    Septembre 2002
    Messages
    2 307
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 307
    Points : 2 814
    Points
    2 814
    Par défaut
    var response = objXMLHttpRequest.responseText;
    le retour est du texte qui ne contient aucun attribut !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2009
    Messages : 115
    Points : 53
    Points
    53
    Par défaut
    Je vous remercie de vos aides, mais j'ai pas tout a fait compris

    Pourtant dans mon exemple plus haut je fait l'alert tout à la fin et si je ne me trompe pas, la 4eme étape est la dernière ?

    Pour ce qui est de l'attribut, je ne vois pas. Je suis désolé encore

    Est ce que vous pouvez m'en dire une peu plus SVP ?

    Merci

  5. #5
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Salut.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    callBack : function(data) {
    	return data.script;
    }
    Commence par te poser la question de savoir dans quelle fonction tu fais le return, donc quelle fonction le reçoit

  6. #6
    Membre expérimenté
    Avatar de gwyohm
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 925
    Points : 1 333
    Points
    1 333
    Par défaut
    Citation Envoyé par nicko_73 Voir le message
    Pourtant dans mon exemple plus haut je fait l'alert tout à la fin et si je ne me trompe pas, la 4eme étape est la dernière ?
    Et bien c'est là que tu te trompes ; un peu de lecture http://javascript.developpez.com/faq...jax.asynchrone

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2009
    Messages : 115
    Points : 53
    Points
    53
    Par défaut
    Merci pour la lecture

    1°) Problème
    Dites moi si je me trompe lorsque je mets true dans le troisième argument de la fonction open(), ajax est asynchrone. Donc il utilise onreadystatechange je peux donc faire autre chose a coté en attendant la fin de l'action ajax.

    Donc dans mon cas, avec exécution rapide du script, il se peut qu'il affiche une valeur qui n'existe pas encore d'où undefined.

    J'ai donc mis false dans le troisième argument par contre il n'a plus l'air du tout de passer dans cette partie du script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objXMLHttpRequest.onreadystatechange = function() {manager.response(setting.callBack)};
    2°) Problème
    Commence par te poser la question de savoir dans quelle fonction tu fais le return, donc quelle fonction le reçoit
    Alors oui effectivement je fait en return que dans la fonction callBack, j'ai donc modifier ma méthod get comme ceci :

    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
     
    	get : function(setting) {
    		objXMLHttpRequest = manager.requestObject();
     
    		if(typeof(setting.mode) == 'undefined') {
    			setting.mode = true;
    		}
     
    		if(typeof(setting.json) == 'undefined') {
    			manager.json = false;
    		} else {
    			manager.json = setting.json;
    		}
     
    		objXMLHttpRequest.open('GET', setting.url, setting.mode);
     
    		objXMLHttpRequest.onreadystatechange = function() {return manager.response(setting.callBack)};
     
    		objXMLHttpRequest.send(null);
     
    		return objXMLHttpRequest;
    	},
    Mais là c'est un autre problème qui viens à moi c'est qu'il me retourne l'objet : XMLHttpRequest.

    j'ai donc mis XMLHttpRequest.responseText dans le dernier return, mais àa m'affiche la valeur qu'en mode synchrone (si je ne n'embrouille pas).

    Je ne vois pas comment faire pour que cela fonction dans les deux cas.

  8. #8
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Il faut bien comprendre une chose, c'est que quand une fonction a appelle une fonction b, un return dans la fonction b est pertinent car la fonction a attend bien sagement que b ait fini son exécution pour continuer son traitement.
    Dans le cas d'une requête Ajax asynchrone, ce n'est pas le cas, la requête est lancée et la fonction continue son traitement. Une instruction return dans le callback n'a donc pas beaucoup de sens dans ce cas.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2009
    Messages : 115
    Points : 53
    Points
    53
    Par défaut
    Dans ce cas, je ne comprends pas pourquoi vous m'avez dit ceci :
    Commence par te poser la question de savoir dans quelle fonction tu fais le return, donc quelle fonction le reçoit
    Cela voudrait-il dire que je suis obliger d'exécuter tout un script la fonction callBack ? Je ne peux donc pas faire de return pour les mettre dans une variable pour interpréter les données plus tard ?

  10. #10
    Expert éminent sénior

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Points : 79 912
    Points
    79 912
    Par défaut
    Vous pouvez enregistrer le résultat dans un champ du formulaire que vous irez relire plus tard.

  11. #11
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Dans ce cas, je ne comprends pas pourquoi vous m'avez dit ceci :
    Commence par te poser la question de savoir dans quelle fonction tu fais le return, donc quelle fonction le reçoit
    Pour que tu te rendes compte que le return ne renvoie pas le résultat à la fonction que tu pensais, ce qui est une erreur assez fréquente, pas uniquement dans le cas d'Ajax
    Cela voudrait-il dire que je suis obliger d'exécuter tout un script la fonction callBack ?
    C'est la façon habituelle de procéder.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2009
    Messages : 115
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par vermine Voir le message
    Vous pouvez enregistrer le résultat dans un champ du formulaire que vous irez relire plus tard.
    Oui c'est vrai mais je ne vais pas forcement utiliser de formulaire. Ce que je ne comprend pas non plus, c'est que comme je suis dans une classe, je devrais pouvoir, toujours dans le mode asynchrone, mettre les valeurs de objXMLHttpRequest.responseText dans un attribut comme par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    manager.value = objXMLHttpRequest.responseText;
    Puis la traiter plus tard mais ca ne fonctionne pas; Merci pour ta solution vermine

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2009
    Messages : 115
    Points : 53
    Points
    53
    Par défaut
    Hehe même pas le temps de répondre

    J'ai bien pris note :

    C'est la façon habituelle de procéder.
    Voisi ma nouvelle fonction en suivant vos conseils :

    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
    	get : function(setting) {
    		objXMLHttpRequest = manager.requestObject();
     
    		if(typeof(setting.mode) == 'undefined') {
    			setting.mode = true;
    		}
     
    		if(typeof(setting.json) == 'undefined') {
    			manager.json = false;
    		} else {
    			manager.json = setting.json;
    		}
     
    		objXMLHttpRequest.open('GET', setting.url, setting.mode);
     
     
    		objXMLHttpRequest.send(null);
     
    		if(setting.mode == true) {
    			objXMLHttpRequest.onreadystatechange = function() {manager.response(setting.callBack)};
    		} else {
    			var response = objXMLHttpRequest.responseText;
     
    			if(typeof(manager.json) != 'undefined' && manager.json === true) {
    				response = window["eval"]("(" + response + ")");
    			}
     
    			return response;
    		}
     
    	},
     
    	response : function(callBack) {
    		if(objXMLHttpRequest.readyState == 4) {
    			if(objXMLHttpRequest.status == 200) {
    				var response = objXMLHttpRequest.responseText;
     
    				if(typeof(manager.json) != 'undefined' && manager.json === true) {
    					response = window["eval"]("(" + response + ")");
    				}
     
    				callBack(response)
    			}
    		}
     
    	},
    Qu'est ce que vous en pensez ?

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

Discussions similaires

  1. eval de json en retour d'ajax sous IE
    Par Isalyn dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 29/02/2012, 08h21
  2. Object en retour d'ajax
    Par the-destroyer dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/03/2010, 08h37
  3. Réponses: 2
    Dernier message: 05/04/2009, 15h41
  4. [AJAX] interface boucle retour fonction Ajax dans code Php
    Par sami117 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/02/2009, 19h41
  5. [AJAX] Le retour d'AJAX n'est pas "actif"
    Par DrDam dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 08/12/2008, 14h29

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