IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

PBM Display / Rafraichissement / timer...


Sujet :

JavaScript

  1. #1
    Membre très actif Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Par défaut PBM Display / Rafraichissement / timer...
    Salut à tous,

    J'ai une page HTML avec la fonction Javascript suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     function Export()
     {
      document.Frame_Export.location.href='/script/export.dll/Export_Fiche';
     
      document.all('textDiv').style.display='inline';
     
      <!-- BOUCLE D'ATTENTE DE GENERATION DU FICHIER --> 
      date = new Date();
      var curDate = null;
      do { var curDate = new Date(); } 
      while(curDate-date < 5000);
     
     
      <!-- TELECHARGEMENT DU FICHIER -->
      XLS.click();
     
      document.all('textDiv').style.display='none';
     }
    et dans le code HTML j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     <!-- BOUTON POUR GENERER LE FICHIER DANS l'IFRAME -->
     <form  method="Post" action="javascript:Export()">
      <input type="submit" value="Export" class="button" >&nbsp;
      <div id="textDiv" style="display:none;">Préparation du fichier...</div>
     </form>
    Le but étant d'afficher un message d'attente pendant que le fichier est généré coté serveur, puis d'ouvrir automatiquement une fenêtre de téléchargement.

    Tout fonctionne bien, sauf que le "...display=inline" ne s'effectue qu'APRES que la boucle d'attente soit finie, ce qui ne sert strictement à rien, du coup.

    Par contre, si j'intercale un "alert('toto')" entre le "...display=inline" et la boucle, le texte apparait bien au moment ou la popup d'alerte s'affiche, et avant le début de la boucle. Ce qui est débile !

    Y a t'il une ruse pour forcer le refresh d'un élément ?

    Ou bien autre chose qui m'échappe ???

    Ca me rend dingue ce truc !!

    Merci d'avance pour vos réponses

  2. #2
    Membre confirmé Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Par défaut
    Bjr

    Si tu restes toujours dans le même domaine (même site) sur ton serveur alors tu peux utiliser AJAX côté client (non ca n'a rien à voir avec un produit d'entretient ) de façon asynchrone (avec mettons de l'autre côté sur le serveur un script PHP ) et ca va faire exactement ce que tu veux.


    Si tu veux un exemple AJAX+PHP post à nouveau

  3. #3
    Membre très actif Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Par défaut
    Le problème c'est que je n'aurai pas accès au serveur de prod final, ni aux postes clients, donc je dois me limiter à utiliser du standard qui ne nécessite aucune configuration ou déploiement particulier, coté client ou serveur.

  4. #4
    Membre confirmé Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Par défaut
    Re

    AJAX ne nécessite aucun déploiement particulier ni côté client, ni côté serveur (d'ailleurs il marche avec des réquêtes HTTP donc peut importe le serveur) Sinon je ne m'en servirais pas !

    La limite est encore une fois que tu ne peux pas exécuter de requêtes en dehors de ton domaine.

    La seule chose à faire pour l'utilisateur est d'autoriser Javascript et au moins l'activeX pour ta page (hé oui IE n'intègre pas en natif l'objet nécessaire pour utiliser AJAX contrairement à FireFox ou Opera ... )

    Pour que ce fonctionne il suffit que tu appelles ta page qui prépare ton téléchargement non plus directement mais en utilisant AJAX et c'est tout

    AJAX est juste un acronyme pour Asynchronous JavaScript And XML (« XML et Javascript asynchrones ») mais ca marche également avec du texte lambda.

    AJAX existe depuis longtemps en plus ... mais je ne m'en sers que depuis très récemment

  5. #5
    Membre très actif Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Par défaut
    ben du coup, oui, ça m'interesse...

  6. #6
    Membre confirmé Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Par défaut
    RE

    Il existe encore un autre moyen sans AJAX : par contre tu dois être maître de la page qui génére le fichier à télécharger.

    En voyant ton XLS.click(); j'ai comme un doute ! Ca a un rapport avec Excel ?

    Tu appelles bien une page web pour générer ton fichier non ?

    Que te retourne-t-elle ?

  7. #7
    Membre très actif Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Par défaut
    Tu appelles bien une page web pour générer ton fichier non ?
    Non, j'utilise une DLL Isapi codée en Delphi.

    C'est juste un appel à une procédure qui va générer le fichier .csv sur le serveur. C'est tout, ça ne retourne rien, ce qui me permet de ne pas avoir à gérer le rechargement de la page à partir de laquelle on peut télecharge le fichier.

  8. #8
    Membre confirmé Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Par défaut
    Bjr

    En fait je crois que tu n'as pas besoin d'utiliser AJAX.

    Tu veux juste afficher un message indiquant à l'utilisateur de patienter



    Voici un ex tout bête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    <html>
    <head>
    <script language="JavaScript">
    <!--
    // Fct pour faire une pause
    function pause(millis) 
    {
     date = new Date();
     var curDate = null;
     do { var curDate = new Date(); } 
     while(curDate-date < millis);
    } 
    function traitement() 
    {
            document.getElementById("btn_ok").disabled = true;
     document.getElementById("resultat").innerHTML="Génération du fichier en cours sur le serveur . Veuillez patienter SVP !";
     setTimeout("exec_traitement()",500);
    }
    function exec_traitement()
    { 
     // pause de 5 secondes pour simuler un traitement qui dure ...
     pause(5000);
     // informe l'utilisateur
     document.getElementById("btn_ok").disabled = false;
     document.getElementById("resultat").innerHTML = "Vos données sont prêtes Maître !"; 
    }
    //-->
    </script>
    </head>
    <body>
    <form>
    <input type="button" id="btn_ok" value="Préparer le fichier (durée 5 sec environ)" onclick="traitement()">
    </form>
    <br/>
    <div id="resultat"></div>
    </body>
    </html>

    1. le onclick du bouton btn_ok appelle la fct traitement()
    2. la fct traitement() invalide le bouton et affiche le msg d'attente
      et lance le véritable traitement en différer de 500 ms via setTimeout
    3. la fct exec_traitement() fait le boulot : ici une pause de 5 sec
    Dans la fct exec_traitement place ton code et supprime éventuellement la pause

    Est-ce que ton traitement (ton appel de l'API) est bloquant ?
    Je veux dire est-ce que XLS.click(); bloque le navigateur ou bien rend la main aussitôt à l'utilisateur ?
    Est-ce qu'il retourne une indication au navigateur lorsque le traitement est fini ?

  9. #9
    Membre très actif Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Par défaut
    Est-ce que ton traitement (ton appel de l'API) est bloquant ?
    Non, car c'est appelé dans une Iframe, et ça ne retourne rien, donc ça ne perturbe pas la page principale.

    Je veux dire est-ce que XLS.click(); bloque le navigateur ou bien rend la main aussitôt à l'utilisateur ?
    XLS.Click ne sert qu'à ouvrir la fenêtre de télechargement du fichier généré, rien de plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <!-- LIEN PASSIF POUR TELECHERGER LE FICHIER --> 
     <A name="XLS" href="/export_hotel.csv" type="application/octet-stream" target="_blank"></A>
    C'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.Frame_Export.location.href='/script/export.dll/Export_Hotel';
    qui génére le fichier.
    Et pendant son exécution, le bouton du formulaire reste enfoncé, comme bloqué, mais je peux interrompre le traitement en cliquant sur un autre lien.

    Est-ce qu'il retourne une indication au navigateur lorsque le traitement est fini ?
    non.


    J'ai repris ton exemple, j'ai juste réadapté la fonction exec_traitement à mes besoins, comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        function exec_traitement()
        { 
             document.Frame_Export.location.href='/script/sogeho.dll/Export_Hotel';
     
             // informe l'utilisateur
             document.getElementById("btn_ok").disabled = false;
             document.getElementById("resultat").innerHTML = "Vos données sont prêtes Maître !"; 
             XLS.click();
        }
    Les messages s'affichent bien, par contre j'ai le même problème que lorsque j'avais essayé de mettre le XLS.click() dans un SetTimeout, c.a.d. qu'au lieu d'ouvrir la fenêtre de télechargement, le popup-blocker d'IE se déclenche et empêche l'ouverture automatique de la fenêtre. Donc pas bon.

    C'est dingue, mon exemple ouvre proprement le download, mais n'affiche pas les messages, et le tient affiche bien les messages mais pas le download... alors qu'en gros, on fait la même chose !

  10. #10
    Membre très actif Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Par défaut
    Bon, j'ai trouvé une solution de rechange, en reprenant mon code d'origine, et en remplaçant les innerHTML par des defaultStatus.

    Du coup, au lieu d'avoir un texte à coté du bouton, le message d'attente apparait dans la barre de status.

    Et là, ça marche bien, c'est initialisé avant la génération du fichier, et effacé après le click.

    Alors pourquoi defaultStatus fonctionne et pas innerHTML, ça c'est un truc que j'aimerai bien comprendre...

  11. #11
    Membre confirmé Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Par défaut
    Re

    là j'avoue que pour le coup du Popup Blocker de IE j'ai pas d'idée (je n'ai pas le Popup Blocker sous IE : SP1 oblige )

    Tout bon Popup blocker ne devrait pas bloquer les popups dû moment que l'adresse de base est la même que la fenêtre parente mais visiblement ce n'est pas le cas ...


    Par contre le fait que les messages ne s'affichent pas c'est pareil sous Delphi : en fait les API windows donnent la priorité au programme et l'affichage (càd la gestion des messages WM_PAINT) s'effectue en seconde plan qd l'application est idle. Mais bien sûr sous Dephi on peut forcer le rafraissiment immédiat

    Bien sûr il existe toujours des objets qui forcent leur propre rafraîchissement (ou dessin) donc leur apparence change aussitôt.

    Si tous les objects de l'interface graphique s'actualisaient à chaque fois les applications seraient trop lentes à mon avis


    Enfin ca fonctionne c'est l'essentiel

  12. #12
    Membre très actif Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Par défaut
    En fait, ça n'est pas vraiment le pop-up blocker, mais l'avertissement concernant le télechargement de fichiers sensibles (.exe).

    Il ne se déclenche pas si le XLS.Click() reste dans la fonction principale du bouton, mais si je le déplace ou si je le mets dans un SetTimeout, c'est là qu'il se déclenche et empêche le télechargement automatique.

    Encore une bizarrerie...

Discussions similaires

  1. PBM rafraichissement champ lookup dans une grille
    Par fredfred dans le forum Composants VCL
    Réponses: 0
    Dernier message: 09/12/2010, 16h01
  2. Pbm pour afficher l'heure avec timer
    Par lostsoul dans le forum Général Java
    Réponses: 2
    Dernier message: 14/12/2009, 02h11
  3. [JList et Timer] Rafraichissement
    Par Shiftane dans le forum Composants
    Réponses: 3
    Dernier message: 27/12/2005, 16h28
  4. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 18h07
  5. Pbm avec les '&'...
    Par AmaX dans le forum Composants VCL
    Réponses: 2
    Dernier message: 19/08/2002, 11h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo