Patienter pendant une requete Ajax

Résolu
deterred Messages postés 35 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 27 août 2007 - 27 nov. 2006 à 11:59
Mastronic Messages postés 94 Date d'inscription lundi 8 août 2005 Statut Membre Dernière intervention 13 juin 2012 - 5 déc. 2006 à 14:22
Bonjour,

J'ai une grosse requete Ajax a executer, et le chargement est long.
Je voudrais mettre à la place de mon compteur de résultat un message du genre "chargement en cours"

Voici comment je m'y prend, et ça ne fonctionne pas :

function rafraichirResultats() {
    document.getElementById("nbFormations").innerHTML = "Chargement en cours ... ";
    var nbRes = getResponseURL("GET", "requetesAjax.asp","action=getNbForm");

    sessionRecherchePerdue(nbRes);

    document.getElementById("nbFormations").innerHTML = nbRes;
}

Avez vous une idée ???

J'ai essayé de mettre un "document.recalc();" a la deuxieme ligne (avant de lancer l'ajax), mais ça ne donne rien sous IE, et plante sous FF ...
Si quelqu'un peut m'aider, ça sera super sympa !

17 réponses

cs_roro06 Messages postés 732 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 29 octobre 2007
27 nov. 2006 à 20:48
Bonjour






Mon idée, c'était :

function rafraichirResultats2(parm)
    {
    document.getElementById("nbFormations").innerHTML = "Chargement en cours ... ";
    var xho=getHTTPobject();
    if (xho)
        {
        xho.onreadystatechange=function()
            {
            if (xho.readyState == 4) // 4=httpComplete
                {
                if (xho.status == 200) // 200 : code Http : OK
                    {
                    document.getElementById("nbFormations").innerHTML =
xho.responseText





                    }
                }
            }
        var filtre="action=" + parm;
        with (xho)
            {
             open("POST", "requetesAjax.asp", true);
            setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=iso-8859-1")
            send(filtre);
            }
        }
    else
        {
        alert("Error !! \nAJAX Unsupported !");
        }
    }


(A adapter, hein, c'est pas du pré-maché !)

ça fonctionne, c'est testé, ça marche sur IE ET sur FF, ça affiche les messages dans l'ordre désiré, et t'en fait ce que tu veux , je m'en f...!

Et pour clore ce débat, j'ajouterai que :
1/ Je ne réponds pas à coté, mais je quémande des bout de code dans le but de répondre à ta question de manière précise ! (C'est un peu facile de poster 3 lignes et de demander "qu'est-ce qui va pas"). Un problème bien posé est à moitié résolu, elle t'a pas appris ça, la maîtresse ?
2/ Les intervenants de ce forum interviennent parcequ'ils le veulent bien, et uniquement pour ça, rien ne les y oblige. Tu as une réponse. Si ça t'énerve, il y a d'autres forums (traduire : "passe ton chemin")

3/ quant à "ton ajax" qui marche très bien, je viens de le tester, bof !

(m'a gonflé, çui-là
  !!)

Cordialement
Roro webDev
3
cs_roro06 Messages postés 732 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 29 octobre 2007
27 nov. 2006 à 14:46
Bonjour




'Faudrait en montrer un peu plus, car il est impossible de savoir ce que font getResponseURL, ni sessionRecherchePerdue();

Cordialement
Roro webDev
0
deterred Messages postés 35 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 27 août 2007
27 nov. 2006 à 14:55
en fait là n'est pas la question, sessionRecherchePerdue(); ne fait que verifier si la session est perdue ou non (et abandonne l'ajax si c'est le cas), getResponseURL lance une requete ajax et recupere le resultat.
Tout ça fonctionne tres bien, mon seul souci serait de faire patienter le visiteur pendant l'execution de la fonction ...
0
cs_roro06 Messages postés 732 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 29 octobre 2007
27 nov. 2006 à 15:08
Bonjour




C'est bien pour ça que je te pose la question, parceque moi je le fais et ça fonctionne

Cordialement
Roro webDev
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
deterred Messages postés 35 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 27 août 2007
27 nov. 2006 à 16:28
aie ! ok ... c'est une piste ...

quand je retire mon sessionRecherchePerdue(); c'est idem ...

voici mon getResponseURL(); :

function getResponseURL(method, strUrl, strData) {
    var xhr_object;
   
    var retour = "";

    if(window.XMLHttpRequest) // Firefox  
        xhr_object = new XMLHttpRequest();
    else if(window.ActiveXObject) // Internet Explorer 
        xhr_object = new ActiveXObject("Microsoft.XMLHTTP");  
    else { // XMLHttpRequest non supporté par le navigateur  
        alert("Erreur : Votre navigateur ne supporte pas les objets XMLHTTPRequest");
        return;
    }
     
    if (method != "POST") {
        strUrl = strUrl + "?" + strData;
    }

    xhr_object.open(method, strUrl, false);
       
    xhr_object.send(strData);
   
    retour = xhr_object.responseText;   
   
    return retour;
}

--------

le souci en fait est que le navigateur se fout completement de la premiere ligne : " document.getElementById("nbFormations").innerHTML = "Chargement en cours ... ";" et execute directement ma requete ajax. Le navigateur devient donc figé pendant 3 secondes, le temps de chargement de mon compteur.
Attention pour bien se rendre compte de mon souci, il faut une requete ajax LOURDE . Pour moi c'est une requete Oracle avec 18 tables jointes et des conditions assez complexes, en particulier incluant une recherche avec synthétiseur sur un champs "mot clés".... Si la requete ajax est rapide, effectivement, on a l'impression que ça fonctionne...
0
cs_roro06 Messages postés 732 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 29 octobre 2007
27 nov. 2006 à 16:51
Bonjour






xhr_object.open(method, strUrl, false);

xhr_object.send(strData);
retour = xhr_object.responseText;   
   

Je suis un peu surpris que ça fonctionne comme ça ! surtout avec autre chose que ie (3 °paramètre de open à false ?).Passons .
Ensuite tu envoie ta requête puis tu affecte ton résultat à retour sans sovoir si la réponse est parvenue (bon d'accord, tu fait du synchrone, mais il n'y a que IE qui accepte çà). Donc "rien sous IE" --> je veux bien, mais que "ça plante FF", çà, ça ne m'etonne pas.

faire plutôt plus "classique" :

...
        xhr.onreadystatechange=function()
            {
            if (xhr.readyState == 4) // 4=httpComplete
                {
                if (xhr.status == 200) // 200 : code Http : OK
                    {
                    // Traitement de la réponse
                    retour=xho.responseText;
                    }
                }
            }
...
xhr_object.open(method, strUrl, true);
xhr_object.send(strData);

Cordialement
Roro webDev
0
deterred Messages postés 35 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 27 août 2007
27 nov. 2006 à 16:56
ok j'ai du mal m'expliquer

MON AJAX FONCTIONNE TRES BIEN, je vous remercie ... le probleme n'est pas là, si vous ne savez pas me dépanner, inutile de répondre des absurdités, ou des hors sujet.

le pb est la fonction javascript : document.recalc(); qui ne donne rien sous IE et plante sous FF (c'est normal je l'ai lu)

Ma question est donc comment palier à ce pb, afin d'afficher un message pendant le chargement de mon ajax ! (cf mon premier post)
0
cs_roro06 Messages postés 732 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 29 octobre 2007
27 nov. 2006 à 17:01
Bonjour





Allez rendre service, je vous jure ...

Pour l'info, moi, je sais faire afficher "Chargement en cours...", et j'ai appris à le faire sans insulter les autres ! et ça marche sur tous les navigateurs. Bon debuggage quand-même.




pas cordialement
Roro webDev
0
deterred Messages postés 35 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 27 août 2007
27 nov. 2006 à 17:08
je n'ai insulté personne o_O, j'ai même remercié.
juste que le pb est toujours le meme sur ces forums, les intervenants ne solutionnent rien, et remettent en cause du code qui fonctionne.
j'ai posé une question on me répond 3 fois a coté, ça a tendance à m'énerver ... that's all, sans rancune, comme d'hab je vais me débrouiller, j'esperais juste gagner un peu de temps
0
deterred Messages postés 35 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 27 août 2007
27 nov. 2006 à 17:15
au fait, je suis pas aussi mal élevé que tu le dis, avant de répondre, j'ai pris le temps d'examiner ton code et de remplacer ma fonction getResponseURL par ta version "plus standard".
ça fonctionne tout aussi bien, mon compteur est bien actualisé seulement au lieu de faire les etapes comme je le voudrais :

- changement du label en "chargement en cours"
- chargement de la requete ajax (environ 4 sec)
- affichage du compteur dans le label

j'obtiens l'enchainement suivant :


- chargement de la requete ajax (environ 4 sec)
- changement du label en "chargement en cours"
- affichage du compteur dans le label

it sucks
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
28 nov. 2006 à 09:40
Bonjour,

Je vais po rajouter de l'huile sur le feu mais Roro a un peu raison. Il prend déja le temps de répondre, c'est déja sympa.

D'un autre coté, il a une vue plutot globale du code dans lequel tu as
la tête dans le guidon. C'est toujours constructif même si il faut du
temps pour analyser les effets de bords.. Car ça, ça arrive plus
souvent k'on le croit..

S.
0
deterred Messages postés 35 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 27 août 2007
28 nov. 2006 à 09:52
J'ai adapté tout ça, le pb est que je n'utilise plus la librairie standard de notre service études ... peu importe.

En tout cas ça fonctionne comme je le souhaite, je te remercie pour ta patience
0
deterred Messages postés 35 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 27 août 2007
28 nov. 2006 à 10:10
Oui on a la tete dans le guidon et on devient agressif sans raison, je suis navré ...

Bon, j'ai approfondi l'utilisation du code, et en fait, j'ai encore un petit pb. FF me plante une erreur "component returned failure code: 0x80040111" sur certains critères de recherche (l'utilisation est un moteur de recherche multi-criteres, un compteur est actualisé à chaque changement de valeur d'un des criteres)

Savez vous dans quelle direction je dois chercher pour ce type de message ?
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
28 nov. 2006 à 10:40
Ces critères ki font planter ne seraient po des critères 'textuels' ?.. un caractère spécial mal interprété et hop.. ça plante..

S.
0
deterred Messages postés 35 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 27 août 2007
28 nov. 2006 à 10:59
bien vu, ça aurait pu, mais non, j'appellais la fonction depuis une popup  window.opener.refreshResultats ...

et apparement il aime pas , m'enfin j'ai trouvé une parade. tout semble correctement fonctionner.
0
Mastronic Messages postés 94 Date d'inscription lundi 8 août 2005 Statut Membre Dernière intervention 13 juin 2012
5 déc. 2006 à 14:19
De mon coté je viens d'essayé.. et ca fonctionne. peut etre que le type d'objet, la ou tu veux affiché n'est pas compattible avec innerHTML...  un peut etre.
mais commme je suis debutant en javascript, je peux me trompé..

roro06, merci pour le test  if (xhr_object.status = = 200) // 200 : code Http : OK
je ne connaissais pas.. il faudra que je me documente  pour traiter les cas d'erreur.. faire des RETRY... par ex.

voici le code:

partie HTML la ou tu veux affiché: 

le code javascript:
 xhr_object.send(data);
 document.getElementById("barre_etat").innerHTML = "Chargement en cours ... ";

et dans la fonction qui recupere le resultat:
xhr_object.onreadystatechange = function anonymous()
 { if(xhr_object.readyState == 4)  // 4=httpComplete
  {
   if (xhr_object.status == 200) // 200 : code Http : OK
   {
    document.getElementById("barre_etat").innerHTML = "OK";



Cordialement,
0
Mastronic Messages postés 94 Date d'inscription lundi 8 août 2005 Statut Membre Dernière intervention 13 juin 2012
5 déc. 2006 à 14:22
Escusé moi, j'avais pas vue la page 2  .. oups..
0
Rejoignez-nous