Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1540 connectés 

  FORUM HardWare.fr
  Programmation
  HTML/CSS

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1569489
Decapfour
Posté le 04-06-2007 à 10:55:11  profilanswer
 

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
mood
Publicité
Posté le 04-06-2007 à 10:55:11  profilanswer
 

n°1569496
flo850
moi je
Posté le 04-06-2007 à 11:03:06  profilanswer
 

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'

n°1569500
Decapfour
Posté le 04-06-2007 à 11:06:54  profilanswer
 

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.

n°1569812
Decapfour
Posté le 04-06-2007 à 15:32:32  profilanswer
 

toujours rien?

n°1569815
anapajari
s/travail/glanding on hfr/gs;
Posté le 04-06-2007 à 15:34:37  profilanswer
 

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

n°1569822
Decapfour
Posté le 04-06-2007 à 15:39:39  profilanswer
 

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?

n°1569824
gatsu35
Blablaté par Harko
Posté le 04-06-2007 à 15:43:05  profilanswer
 

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)


n°1569826
anapajari
s/travail/glanding on hfr/gs;
Posté le 04-06-2007 à 15:44:13  profilanswer
 

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
n°1569828
flo850
moi je
Posté le 04-06-2007 à 15:44:38  profilanswer
 

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:

n°1569838
Decapfour
Posté le 04-06-2007 à 15:55:42  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  HTML/CSS

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

 

Sujets relatifs
[résolu]/[ACCESS]soustraction formulaire[résolu]Calcul avec Batch
[resolu]Jointure d'un COUNT dans une requête[updated]- [c] centraliser declaration de variable.
[RESOLU] Tableaux d'objets en PHP[Résolu]CheckBoxList c#
Erreur SQL [RESOLU][Resolu/VBA] Priorité des applications
[MySql] Exécution scriptsurcharger l'opérateur '+=' ? [résolu]
Plus de sujets relatifs à : [Resolu]Attente fin d'appel de script PHP avec AJAX


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR