[Resolu]Attente fin d'appel de script PHP avec AJAX

Attente fin d'appel de script PHP avec AJAX [Resolu] - HTML/CSS - Programmation

Marsh Posté le 04-06-2007 à 10:55:11    

Voila j'ai un code javascript qui quadn on clique sur un bouton appelle avec l'ajax un script php qui s'execute, et renvoie la reponse de ce script et la met dans le innerHTML d'un div.
Le problème étant que je voudrais afficher ce qu'il y a dans le div, mais que le temps d'execution du script php peut etre varaible.
Le systeme d'execution du script est asynchrone ( ajax oblige )  et donc l'execution du javascript continue, et ce meme si le script php n'a pas fini ses traitements en arrière plan.
Pour faire un alert() du innerHTML rempli, c'est pas l'optimal, de temps en temps le alert est vide, le script marche bien, mais ca peut vite paniquer les utilisateurs.
Ce que j'ai trouvé pour faire un petit peu mieux, c'est le setTimeout() mais on doit mettre un temps fixe, et justement le temps est très varaible, et je vais pas mettre 3 sec d'attente non plus, faut que ce soit un minimum réactif, sinon les utilisateurs vont cliquer 50 fois sur le bouton.
 

Code :
  1. function modification (valeur, numprix, numprod, dispo1, dispo2, nomprod, option1, dateprod ){
  2.  var dispo2value = document.getElementById('dispo_'+dispo2).value;
  3.  var option2value = document.getElementById('option_'+dispo2).value;
  4.  var seuil2value = document.getElementById('seuil_'+dispo2).value;
  5.  if(parseInt(valeur) == 1){
  6.   var confirmation = confirm('Acceptez vous les modifications? : '+'\n\n'+nomprod+'\n'+dateprod+'\n\n'+'ancienne dispo : '+dispo1+' nouvelle dispo : '+dispo2value+'\n'+'nouveau seuil : '+seuil2value+'\n'+'ancienne option : '+option1+' '+'nouvelle option : '+option2value  );
  7.   if(confirmation == true){
  8.    call("modif.php?num_prix="+numprix+"&modif=M&num_prod="+numprod+"&dispo1="+dispo1+"&dispo2="+dispo2value+"&seuil="+seuil2value+"&options1="+option1+"&options2="+option2value+"&modifok=ok" , document.getElementById('retour_modif'));
  9.    setTimeout("alert((document.getElementById('retour_modif').innerHTML));redirection('recherche.php');", 300);//attente de la fin du call
  10.    //ajax = asynchrone, le call tourne mais le js passe quand meme aux instructions suivantes.
  11.   }
  12.  }
  13.  if(parseInt(valeur) == 2){
  14.   var confirmation = confirm('Acceptez vous de supprimer cette date :'+'\n\n'+dateprod+'\n'+nomprod );
  15.   if(confirmation == true){
  16.    call("modif.php?num_prix="+numprix+"&supp=-&num_prod="+numprod+"&dispo1="+dispo1+"&dispo2="+dispo2value+"&seuil="+seuil2value+"&options1="+option1+"&options2="+option2value+"&suppok=ok" , document.getElementById('retour_modif'));
  17.    setTimeout("alert((document.getElementById('retour_modif').innerHTML));redirection('recherche.php');", 300);//attente de la fin du call
  18.    //ajax = asynchrone, le call tourne mais le js passe quand meme aux instructions suivantes.
  19.   }
  20.  }
  21. }


 
vous cassez pas avec le call, ca appelle un script php et renvoie la reponse ( tous les echos ) dans le innerhtml d'un div ou autre.
vous cassez pas non plus avec les variables, on s'en fous ça marche bien.
le principal c'est dans les deux if, a l'endroit des setTimeout
 
Ce que je voudrais :
==> Pouvoir faire attendre le javascript de la fin de call
 
Ce que j'ai essayé :
==> boucle d'attente active, marche pas.(while(document.getElementByid(..).innerHTML ==""
==>setTimeout, pas optimal


Message édité par Decapfour le 04-06-2007 à 15:56:21
Reply

Marsh Posté le 04-06-2007 à 10:55:11   

Reply

Marsh Posté le 04-06-2007 à 11:03:06    

tu sais que tu peux faire des requetes synchrones en js ( ie : le navigateur est bloqué tant que la requete est pas revenue ) ?  
 
c'est un des paramètres de la fonction 'open'

Reply

Marsh Posté le 04-06-2007 à 11:06:54    

mais si je ne me trompe pas ca ne marche pas ici?
C'est important que ca n'affiche pas le resultat dans une nouvelle fenètre, mais bien dans un alert.

Reply

Marsh Posté le 04-06-2007 à 15:32:32    

toujours rien?

Reply

Marsh Posté le 04-06-2007 à 15:34:37    

vais voir ta fonction call, il va ama falloir la changer.

Reply

Marsh Posté le 04-06-2007 à 15:39:39    

Code :
  1. function getXhr(){
  2.  var xhr = null;
  3.  try {
  4.      xhr = new XMLHttpRequest();
  5.  }
  6.  catch(e)
  7.  {
  8.       xhr = new ActiveXObject("Microsoft.XMLHTTP" );
  9.  }
  10.  return xhr;
  11. }
  12. function call (url, response){
  13.  var xhr = getXhr();
  14.  xhr.onreadystatechange  = function()
  15.      {
  16.          switch (xhr.readyState){
  17.     case 4 :
  18.               if (xhr.status  == 200)
  19.     {
  20.      response.innerHTML = xhr.responseText;
  21.     }
  22.    break;
  23.          }
  24.      };
  25.     xhr.open( "GET", url,  true);
  26.     xhr.send(null);
  27. }


Je vais pas le cacher c'est pas moi qui l'ai faite, je l'ai juste comprise et utilisée.
j'avais bien penser utiliser le truc xhr.readystate, mais comment y accèder a partir de la fonction call?

Reply

Marsh Posté le 04-06-2007 à 15:43:05    

Code :
  1. function call (url, response, asynch){
  2.             var xhr = getXhr();
  3.             xhr.onreadystatechange  = function()
  4.            {
  5.                switch (xhr.readyState){
  6.                      case 4 :
  7.                        if (xhr.status  == 200)
  8.                         {
  9.                             response.innerHTML = xhr.responseText;
  10.                         }
  11.                     break;
  12.                }
  13.            };
  14.           xhr.open( "GET", url,  asynch);
  15.           xhr.send(null);
  16.         }
  17. call ("toto.xml", "GET", false); //synchrone (ce que tu veux quoi hein :o)


Reply

Marsh Posté le 04-06-2007 à 15:44:13    

Code :
  1. function call (url,  callback){
  2.             var xhr = getXhr();
  3.             xhr.onreadystatechange  = function()
  4.            {
  5.                switch (xhr.readyState){
  6.                      case 4 :
  7.                        if (xhr.status  == 200)
  8.                         {
  9.                             if ( callback != undefined && typeof callback == 'function'){
  10.                               callback(xhr.responseText);
  11.                             }
  12.                         }
  13.                     break;
  14.                }
  15.            };
  16.           xhr.open( "GET", url,  true);
  17.           xhr.send(null);
  18.         }


Et ensuite pour l'appeler "comme avant" avec le innerHTML:

Code :
  1. var f = function (str){
  2.   document.getElementById('retour_modif')).innerHTML = str
  3. };
  4. call("modif.php?num_prix="+numprix+"&supp=-&num_prod="+numprod+"&dispo1="+dispo1+"&dispo2="+dispo2value+"&seuil="+seuil2value+"&options1="+option1+"&options2="+option2value+"&suppok=ok" , f);


avec un alert tu as juste à changer f en:

Code :
  1. var f = function (str){
  2.   alert(str);
  3. };
 

edit: moi on m'a dit sans synchrone je fais sans :o


Message édité par anapajari le 04-06-2007 à 15:45:45
Reply

Marsh Posté le 04-06-2007 à 15:44:38    

flo850 a écrit :

tu sais que tu peux faire des requetes synchrones en js ( ie : le navigateur est bloqué tant que la requete est pas revenue ) ?  
 
c'est un des paramètres de la fonction 'open'


 

gatsu35 a écrit :

Code :
  1. ....
  2. call ("toto.xml", "GET", false); //synchrone (ce que tu veux quoi hein :o)



 
c'est ce que j'avais dit :cry:

Reply

Marsh Posté le 04-06-2007 à 15:55:42    

Merci bcp les gens :)
Ca marche bien le coup du false dans le open
J'avais pas assez decrypté la fonction apparement :)

Reply

Sujets relatifs:

Leave a Replay

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