[AJAX]Return dans un onreadystatechange

Return dans un onreadystatechange [AJAX] - HTML/CSS - Programmation

Marsh Posté le 13-12-2006 à 11:16:59    

Bonjour,
 
je suis en train de creer une fonction qui recoit en parametre une requete SQL, execute la requete en AJAX puis renvoie un tableau, le tout en AJAX. Tout marche sauf le return pour retourner le tableua de resultats. Apparemment, la variable liste n'est pas definie dans la fonction rapportée à l'evenement onreadystatechange. Quelq'un aurait il une idée pour pouvoir renvoyer mon tableau? merci...
 
 

Code :
  1. function ajax_select(req_select){
  2. var liste = new Array();
  3. if(_xmlHttp&&_xmlHttp.readyState!=0){
  4.  _xmlHttp.abort();
  5. }
  6. _xmlHttp=getXMLHTTP();
  7.     if(_xmlHttp){
  8.    
  9.     _xmlHttp.open("GET",_adresseRecherche+"?requete="+req_select);
  10.  
  11.      
  12.     _xmlHttp.onreadystatechange=function() {
  13.      if(_xmlHttp.readyState==4 && _xmlHttp.responseXML) {
  14.      liste = traite_reponses(_xmlHttp);
  15.  
  16.      }
  17.     };
  18.    
  19.    
  20.     _xmlHttp.send(null);
  21.  
  22.     }
  23.     return(liste);
  24.    
  25. }

Reply

Marsh Posté le 13-12-2006 à 11:16:59   

Reply

Marsh Posté le 13-12-2006 à 11:29:15    

c'est normal que liste soit inconnue dans le onreadystatechange, tu as clairement un problème de scope avec ta variable.
Le onreadystatechange n'est pas appelé lors de l'execution de ta fonction ajax_select mais lors du changement d'état de ton objet xmlHttpRequest ( qui se produit logiquement après sa construction).

 

Bon maintenant j'imagine que tu as besoin de récupérer ton tableau pour faire autre chose. Le plus simple dans ton cas sera peut-être d'appeler cette "autre chose" à la fin de traite_reponse.

 

edit: ah un truc encore, avec une page qui reçoit en get une requête et l'execute, ça me parait juste over-dangerous


Message édité par anapajari le 13-12-2006 à 11:29:59
Reply

Marsh Posté le 13-12-2006 à 11:31:38    

Justmeent le probleme ne peut pas etre pris dans l'autre sens... Cette fonction est une fonction outil que je vais utiliser dans plusieurs modules... L'ideal serait de pouvoir faire en sorte que la fonction associée au onreadystatechange renvoie liste et que je puisse le recuperer quelque part je pense...

Reply

Marsh Posté le 13-12-2006 à 12:16:15    

Et bin fallait pas faire de l'asynchrone [:spamafote]
C'est le retour d'information (et non l'envoi) qui doit déclencher une action!  
 
Au pire du pire déclare globale ta variable mais ça resoudra que la moitié de ton problème car, même si la bonne valeur y sera mise lors du retour, tu risques d'utilisater ta variable avant celui-ci.

Reply

Marsh Posté le 13-12-2006 à 12:28:47    

Ok, je vais utiliser un post alors... sinon pour declarer une variable globale dans js, je mets juste le var liste =new Array(); en dehors de la fonction non?

Reply

Marsh Posté le 13-12-2006 à 14:39:29    

J'ai toruvé un moyen! Je passe en mode synchrone et ca marche! Il suffit de mettre _xmlHttp.open("GET",_adresseRecherche+"?requete="+req_select,false);
 
et plus besoin du onreadystatechange: l'execution ne se poursuit que quand le fichier xml est completement generé.

Message cité 1 fois
Message édité par gelko le 13-12-2006 à 15:05:40
Reply

Marsh Posté le 13-12-2006 à 14:42:06    

anapajari a écrit :

Et bin fallait pas faire de l'asynchrone [:spamafote]


gelko a écrit :

J'ai toruvé un moyen! Je passe en mode syncrone et ca marche!


[:hahaguy]
 

Reply

Marsh Posté le 13-12-2006 à 15:04:46    

Mon pote, tout le monde n'a pas l'experience que t'as sur la techno... je decouvre, desolé de ne pas avoir la science infuse comme toi on dirait...

Reply

Marsh Posté le 13-03-2009 à 12:20:29    

je remonte ce sujet, mais ayant cherché moi aussi, j'ai trouvé cette solution :
 
ton probleme : exploiter et afficher le resultat appelé par ta fonction AJAX dans différent endroit.
ta solution : "return maVariable;" pour utiliser le dit resultat.
 
ma solution :
document.getElementById(elementId).innerHTML = liste; // oui bon, là j'ai encore rien inventé...
mais en passant dans ta fonction appelante "elementID" pour exploiter le resultat où tu veux lorsque tu fais appel à la fonction.
 
exemple avec ta fonction :

Code :
  1. // inclusion de "elementId" dans les parametres de la fonction
  2. function ajax_select(req_select,elementId){
  3.    var liste = new Array();
  4.    if(_xmlHttp&&_xmlHttp.readyState!=0){
  5.       _xmlHttp.abort();
  6.    }
  7.    _xmlHttp=getXMLHTTP();
  8.    if(_xmlHttp){
  9.       _xmlHttp.open("GET",_adresseRecherche+"?requete="+req_select);
  10.       _xmlHttp.onreadystatechange=function() {
  11.       if(_xmlHttp.readyState==4 && _xmlHttp.responseXML) {
  12.          liste = traite_reponses(_xmlHttp);
  13.          document.getElementById(elementId).innerHTML = liste ;  // appel de elementId pour inserer où il faut ton resultat
  14.       }
  15.    }
  16.       _xmlHttp.send(null);
  17.    }
  18. }


 
l'appel à la fonction se fait où tu veux dans ta page !APRES CONSTRUCTION! de ton element HTML dont id=elementId

Code :
  1. <input type="text" id="monInput" onMouseUp="javascript:ajax_select('ta_requete', 'monInput'){">


 
je sais : c'est pas "très" W3C, mais tant que les navigateurs integrerons la methode "innerHTML", c'est quand même plus simple.
tu peux gerer le tout en asynchrone, et inserer le resultat où tu veux dans tes pages html.
 
inconvénient : si tu veux retourner le resultat dans un script...
mais peut-etre peux-tu appeler une fonction js de mise en forme de "liste" en fonction d'un parametre passé à "ajax_select(req_select,elementId)" ?
-  :sleep:  
-oui bon...
ben ce qui fera quand même :

Code :
  1. function exploitation_1(liste){
  2.     ... exploitation... ;
  3.     document.getElementById(elementId).innerHTML = liste;
  4. }
  5. function exploitation_2(liste){
  6.     ... exploitation... ;
  7.     document.getElementById(elementId).innerHTML = liste;
  8. }
  9. function exploitation_3(liste){
  10.     ... exploitation... ;
  11.     document.getElementById(elementId).innerHTML = liste;
  12. }
  13. function ajax_select(req_select,elementId,typeMiseEnForme){
  14.     ...;
  15.     liste = "...";
  16.     if(exploitation_1) exploitation_1(liste);
  17.     ...;
  18. }


appelé par "ajax_select("ta_Requete","Id_de ton_element, "exploitation_1" );"
 
voili, voilou...


Message édité par Slidejo le 13-03-2009 à 12:23:29
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed