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 :

Afficher un div pendant un traitement client javascript


Sujet :

JavaScript

  1. #1
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut Afficher un div pendant un traitement client javascript
    Bonjour à tous,

    je me galère depuis des heures pour essayer d'afficher un div contenant une image lors d'un traitement javascript qui peut durer plusieurs secondes.

    Ce traitement jscript permet de récupérer un tableau html afin de lui fixer ses entetes. Il redessine ainsi le tableau avec des scrolls. Il est executé coté client sur le click d'un bouton.
    Malheureusement selon la taille initiale de ce tableau la fonction peut durer un certain temps.

    Alors pendant ce temps je veux afficher mon div avec une image indiquant de patienter.

    Au niveau du code, je suis arrivé à un certain résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    document.getElementById("waitDiv").style.display="block";
    mafonctiondetraitementjscript();
    document.getElementById("waitDiv").style.display="none";
    Le problème c'est que je ne vois rien. Ma page se freeze jusqu'à l'affichage finale de mon tableau. Alors j'ai mis un alert('coucou'); après ma première ligne de code pour voir ce qui se passe et mon div s'affiche bien mais l'image gif qu'il contient reste figé.

    Je me demande ce que je peux faire. On dirait qu'il faudrait que j'execute la lourde fonction javascript en asynchrone, est-ce possible?
    Voyez-vous d'autres solutions ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    il faut passer par une variable flag (témoin)

    et une boucle setInterval qui vient tester regulièrement cette variable ...

    au debut du traitement tu mets la vairable = false
    en fin de traitemetn tu le remets à true

    la boucle setInterval vient tester ce flag et modifie ce que tu veux quand il redevient true

  3. #3
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut
    arf j'ai testé mais cela ne fonctionne pas. Je fais peut-etre erreur au niveau de mon code. mon timer lance des intervals uniquement dès que ma lourde fonction à laissé la main.

    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 test(content)
    {
    var boli = false;
    var t1 = setInterval("displayz("+boli+")",1000);
    CreateScrollHeader(content,true,true,40,200,boli);
    clearInterval(t1);
    }
    function displayz(b)
    {
    if (b=true)
    {
    alert("affiche");
    }
    else
    {
    alert("masque");
    }
    }
    Ce que je recherche, 'j'ai l'impression serait presque du multithread.

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Bonjour,
    pour éviter ce problème, as-tu essayé de lancer CreateScrollHeader() par un setTimeout() (de 1ms, par exemple).
    Ca devrait éviter d'attendre que ta fonction rende la main, justement ...

    A+

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    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
    39
    <html>
    <head>
    <script type="text/javascript">
    <!--
    var flag=false;
    var runCheck;
     
    function traitement(){
        for(i=0;i<100;i++){
     
        if(i==99){flag=true;}
     
        }
     
    }
     
    function checkFlag(){
    if(flag){clearInterval(runCheck)
    document.getElementById('mire').style.display='none'
     
    }
     
    }
     
    function Launch(){
    document.getElementById('mire').style.display="block";
     
    traitement()
    runCheck=setInterval(function(){checkFlag()},1000)
     
    }
    //-->
    </script>
    </head>
    <body>
    <div id="mire" style='display:none'> Traitement en cours ... </div>
    <input type='button' value="go" onclick="Launch()" style="width:300px">
    </body>
    </script>

  6. #6
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut
    Merci pour vos conseils Spacefrog et E.bzz.
    Un mix de vos deux solutions m'ont au moins permis d'afficher l'image pendant l'execution de mon traitement.

    C'est déjà pas mal. Ci-dessous voici le code :

    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
    var bolus=true;
    var runCheck;
    function test(content)
    {
    document.getElementById('img_wait').style.display='block';
    setTimeout(function(){CreateScrollHeader(content,true,true,40,200)});
    runCheck=setInterval(function(){displayz()},1000);
    }
    function displayz()
    {
    if(bolus){
    clearInterval(runCheck)
    document.getElementById('img_wait').style.display='none';
    }
    }
    
    Mais j'ai toujours le soucis suivant. L'image censée faire patienter est un gif animé , qui ne l'est pas pendant le traitement.
    Si vous avez des conseils ? En tout cas merci pour votre aide qui m'a permis d'avancer.

  7. #7
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Citation Envoyé par predalpha Voir le message
    Mais j'ai toujours le soucis suivant. L'image censée faire patienter est un gif animé , qui ne l'est pas pendant le traitement.
    J'ai peur que JS ne puisse rien pour toi à ce niveau là

    A+

  8. #8
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    ton gif a-t-il fini de charger ?
    c'est une image preloadeée ?

  9. #9
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut
    Le gif est très léger 20ko.
    Ma page est toute chargée seulement le bloc contenant l'image est display:none

    Je pense que le traitement peut etre suffisamment lourd pour bloquer toute animation. Je vais essayer avec plus petit pour voir.

  10. #10
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut
    Merci encore pour les conseils.

    J'ai réalisé encore quelques tests.
    - Un gif plus petit ne change rien.
    - Utilisation d'une fonction de pause en esperant que la gif s'anime mais non.

    Je garde une petite piste sous le coude :
    lorsque je place un alert juste après l'affichage de ma gif, je la vois s'animer derrière. En gros, il faudrait que je simule des actions qui rendent la main à l'utilisateur et qui la reprenne successivement pour réaliser mon opération.

    ++

  11. #11
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Citation Envoyé par predalpha Voir le message
    Je garde une petite piste sous le coude :
    lorsque je place un alert juste après l'affichage de ma gif, je la vois s'animer derrière.
    Ben, c'est pas juste que l'alert() suspend les traitements qui, justement, empêchent le clignotement ?

    Si tu dois mettre une alert() pour que l'utilisateur voit clignoter le gif qui lui dit "Traitements en cours", autant mettre le message dans l'alert()

    A+

  12. #12
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    ou dans le gif ...

  13. #13
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut
    Citation Envoyé par E.Bzz Voir le message
    Ben, c'est pas juste que l'alert() suspend les traitements qui, justement, empêchent le clignotement ?

    Si tu dois mettre une alert() pour que l'utilisateur voit clignoter le gif qui lui dit "Traitements en cours", autant mettre le message dans l'alert()

    A+
    Non si je mets l'alert c'est juste dans le cadre de tests sinon je ne me serais pas ennuyer à faire cela. L'alert lorsqu'elle apparait semble rendre la main à l'utilisateur en suspendant le gros traitement (on dirait). C'est uniquement dans ce cas là que ma gif s'anime (tant que l'alert est visible) sinon elle est freezée si je ne mets pas l'alert.

  14. #14
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    à tout hasard essaye d'externaliser la fonction qui rend l'image visible ...

    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
     
    var bolus=true;
    var runCheck;
    function test(content)
    {
    showImage();
    setTimeout(function(){CreateScrollHeader(content,true,true,40,200)});
    runCheck=setInterval(function(){displayz()},1000);
    }
    function displayz()
    {
    if(bolus){
    clearInterval(runCheck)
    document.getElementById('img_wait').style.display='none';
    }
    }
     
    function showImage(){document.getElementById('img_wait').style.display='block';}

  15. #15
    Membre averti Avatar de predalpha
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    392
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 392
    Points : 363
    Points
    363
    Par défaut
    Arf dommage mon spacefrog, cela n'a pas amélioré la situation.
    L'image demeure figée. J'ai plus qu'à la changer car sans multithread ou gestion du proc je crois que l'on se heurte à un mur.

    Merci encore pour vos aides. Je laisse le topic ouvert si vous avez encore des idées.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Afficher des informations pendant un traitement
    Par Job dans le forum C#
    Réponses: 3
    Dernier message: 12/04/2012, 12h33
  2. Afficher une div avec un traitement Ajax
    Par arthuro45 dans le forum Ext JS / Sencha
    Réponses: 3
    Dernier message: 16/05/2010, 22h32
  3. comment afficher un gif pendant un traitement
    Par dietrich dans le forum ASP
    Réponses: 1
    Dernier message: 17/01/2007, 18h12
  4. comment afficher un gif au centre de la page pendant un traitement
    Par dietrich dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 17/01/2007, 11h50

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