Patienter pendant une requete Ajax [Résolu]

deterred 35 Messages postés mercredi 27 avril 2005Date d'inscription 27 août 2007 Dernière intervention - 27 nov. 2006 à 11:59 - Dernière réponse : Mastronic 98 Messages postés lundi 8 août 2005Date d'inscription 13 juin 2012 Dernière intervention
- 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 !
Afficher la suite 

Votre réponse

17 réponses

cs_roro06 732 Messages postés jeudi 2 janvier 2003Date d'inscription 29 octobre 2007 Dernière intervention - 27 nov. 2006 à 20:48
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_roro06
cs_roro06 732 Messages postés jeudi 2 janvier 2003Date d'inscription 29 octobre 2007 Dernière intervention - 27 nov. 2006 à 14:46
0
Utile
Bonjour




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

Cordialement
Roro webDev
Commenter la réponse de cs_roro06
deterred 35 Messages postés mercredi 27 avril 2005Date d'inscription 27 août 2007 Dernière intervention - 27 nov. 2006 à 14:55
0
Utile
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 ...
Commenter la réponse de deterred
cs_roro06 732 Messages postés jeudi 2 janvier 2003Date d'inscription 29 octobre 2007 Dernière intervention - 27 nov. 2006 à 15:08
0
Utile
Bonjour




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

Cordialement
Roro webDev
Commenter la réponse de cs_roro06
deterred 35 Messages postés mercredi 27 avril 2005Date d'inscription 27 août 2007 Dernière intervention - 27 nov. 2006 à 16:28
0
Utile
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...
Commenter la réponse de deterred
cs_roro06 732 Messages postés jeudi 2 janvier 2003Date d'inscription 29 octobre 2007 Dernière intervention - 27 nov. 2006 à 16:51
0
Utile
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
Commenter la réponse de cs_roro06
deterred 35 Messages postés mercredi 27 avril 2005Date d'inscription 27 août 2007 Dernière intervention - 27 nov. 2006 à 16:56
0
Utile
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)
Commenter la réponse de deterred
cs_roro06 732 Messages postés jeudi 2 janvier 2003Date d'inscription 29 octobre 2007 Dernière intervention - 27 nov. 2006 à 17:01
0
Utile
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
Commenter la réponse de cs_roro06
deterred 35 Messages postés mercredi 27 avril 2005Date d'inscription 27 août 2007 Dernière intervention - 27 nov. 2006 à 17:08
0
Utile
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
Commenter la réponse de deterred
deterred 35 Messages postés mercredi 27 avril 2005Date d'inscription 27 août 2007 Dernière intervention - 27 nov. 2006 à 17:15
0
Utile
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
Commenter la réponse de deterred
syndrael 2382 Messages postés lundi 4 février 2002Date d'inscription 29 décembre 2012 Dernière intervention - 28 nov. 2006 à 09:40
0
Utile
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.
Commenter la réponse de syndrael
deterred 35 Messages postés mercredi 27 avril 2005Date d'inscription 27 août 2007 Dernière intervention - 28 nov. 2006 à 09:52
0
Utile
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
Commenter la réponse de deterred
deterred 35 Messages postés mercredi 27 avril 2005Date d'inscription 27 août 2007 Dernière intervention - 28 nov. 2006 à 10:10
0
Utile
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 ?
Commenter la réponse de deterred
syndrael 2382 Messages postés lundi 4 février 2002Date d'inscription 29 décembre 2012 Dernière intervention - 28 nov. 2006 à 10:40
0
Utile
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.
Commenter la réponse de syndrael
deterred 35 Messages postés mercredi 27 avril 2005Date d'inscription 27 août 2007 Dernière intervention - 28 nov. 2006 à 10:59
0
Utile
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.
Commenter la réponse de deterred
Mastronic 98 Messages postés lundi 8 août 2005Date d'inscription 13 juin 2012 Dernière intervention - 5 déc. 2006 à 14:19
0
Utile
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,
Commenter la réponse de Mastronic
Mastronic 98 Messages postés lundi 8 août 2005Date d'inscription 13 juin 2012 Dernière intervention - 5 déc. 2006 à 14:22
0
Utile
Escusé moi, j'avais pas vue la page 2  .. oups..
Commenter la réponse de Mastronic

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.