OVH Cloud OVH Cloud

Comment forcer l'affichage ?

13 réponses
Avatar
Olivier Miakinen
Bonjour,

J'ai déjà posé à peu près la même question dans fclj, mais comme
personne n'a su me répondre je la repose dans fciwa. Je mets quand même
le suivi vers fclj car je ne vois pas comment la solution pourrait être
autrement qu'en JavaScript (merci de changer le suivi si je m'étais trompé).

J'ai un script en JavaScript qui fait des tas de choses très longues
(je passe les détails) et qui de temps en temps rajoute des messages
pour faire patienter, au moyen de la fonction appendChild() du Document
Object Model (DOM).

Cela fonctionne très bien avec Internet Explorer qui affiche aussitôt
tout ce que je lui demande, mais pas avec Netscape 7 : celui-ci attend
que tous les traitements soient terminés avant d'afficher d'un seul coup
les différents messages d'attente. Avouez que ce n'est pas très utile
d'attendre une minute devant un écran vide, avant de voir s'afficher en
une fraction de seconde : « patientez une minute - patientez 50 secondes
- patientez 40 secondes - patientez 30 secondes - plus que 20 secondes -
j'y suis presque - c'est fini ! »

Alors voilà, je voudrais savoir s'il y a un moyen pour forcer le
navigateur à afficher les messages de progression au fur et à mesure
au lieu de tout faire d'un coup.

Merci !

[ suivi sur fr.comp.lang.javascript ]

10 réponses

1 2
Avatar
ASM

Alors voilà, je voudrais savoir s'il y a un moyen pour forcer le
navigateur à afficher les messages de progression au fur et à mesure
au lieu de tout faire d'un coup.


M'enfin ! ça m'étone ce truc là

Que te dire ?
si on n'a que tes dires ...

N'y aurait-y pas un p'tit exemple (épuré des trucs ne nous concernant pas) ?


--
*******************************************************
Stéphane MORIAUX et son vieux Mac
Aide Pages Perso (images & couleurs, formulaire, CHP)
http://perso.wanadoo.fr/stephane.moriaux/internet/
*******************************************************

Avatar
Hervé Cauwelier
Cela fonctionne très bien avec Internet Explorer qui affiche aussitôt
tout ce que je lui demande, mais pas avec Netscape 7 : celui-ci attend
que tous les traitements soient terminés avant d'afficher d'un seul coup
les différents messages d'attente.


C'est aussi le cas avec Mozilla (Firefox itou ?) ? Car je sais qu'il
attend que la page soit entièrement chargée avant d'exécuter le JS.
C'est très chiant quand une bannière de pub bloque le chargement parce
que le serveur de la régie ne répond plus...

(Je ne suis pas fclj.)

--
Hervé Cauwelier

http://www.oursours.net/

Avatar
Thibaut Allender
C'est aussi le cas avec Mozilla (Firefox itou ?) ? Car je sais qu'il
attend que la page soit entièrement chargée avant d'exécuter le JS.
C'est très chiant quand une bannière de pub bloque le chargement parce
que le serveur de la régie ne répond plus...


ceci explique donc cela !
j'avais effectivement deja constaté ce genre de problème (résolu avec
adblock, ceci dit ;)

mais qu'il attende que la page soit chargée avant d'executer le JS n'est
pas plus mal non ?
si le JS appelle un element tout en bas de la page, par exemple.

--
thibaut allender | freelance | http://capsule.org

Avatar
YD

[...] J'ai un script en JavaScript qui fait des tas de choses très longues
(je passe les détails) et qui de temps en temps rajoute des messages
pour faire patienter, au moyen de la fonction appendChild() du Document
Object Model (DOM).

Cela fonctionne très bien avec Internet Explorer qui affiche aussitôt
tout ce que je lui demande, mais pas avec Netscape 7 : celui-ci attend
que tous les traitements soient terminés avant d'afficher d'un seul coup
les différents messages d'attente. Avouez que ce n'est pas très utile
d'attendre une minute devant un écran vide, avant de voir s'afficher en
une fraction de seconde : « patientez une minute - patientez 50 secondes
- patientez 40 secondes - patientez 30 secondes - plus que 20 secondes -
j'y suis presque - c'est fini ! »

Alors voilà, je voudrais savoir s'il y a un moyen pour forcer le
navigateur à afficher les messages de progression au fur et à mesure
au lieu de tout faire d'un coup.


Le comportement "normal" pour le navigateur est d'attendre que le script
rende la main pour effectuer le rafraîchissement de l'affichage. Peut-être
que dans ton cas le fait que le script appelle une applet Java est
interprété comme une pause par IE qui en profite pour actualiser l'affichage ?

Une solution possible serait de saucissonner le script en ses différentes
étapes, d'utiliser éventuellement des variables globales (pour la variable
the_applet par ex.) et de ruser avec des setTimeout(). Pour reprendre un de
tes articles précédents sur ce sujet (en y ajoutant l'affichage des messages) :

function lafonction(){
affiche(msg1);
the_applet.DeleteKeyPair(label,id);
affiche(msg2);
the_applet.GenerateKeyPair("RSA",1024);
affiche(msg3);
the_applet.DeleteCertificate(label,id);
affiche(msg4);
the_applet.CreateCertificate(label,value);
}

pourrait devenir, l'appel se faisant soit sans changement en écrivant lafonction()
ou alors lafonction(0) (au choix) :

function lafonction(etape){
if(arguments.length = 0)
etape=0; //1er appel effectué sans arguments !
switch(etape){
case 0:
affiche(msg1);
setTimeout("lafonction(" + ++etape +")",20);
break;
case 1:
the_applet.DeleteKeyPair(label,id);
affiche(msg2);
setTimeout("lafonction(" + ++etape +")",20);
break;
case 2:
the_applet.GenerateKeyPair("RSA",1024);
affiche(msg3);
setTimeout("lafonction(" + ++etape +")",20);
break;
//etc.
} //fin du switch case
}

La pause de 20 ms entre les différentes étapes devrait permettre au navigateur de
rafraîchir l'affichage, le script se terminant alors avant de se relancer pour
l'étape suivante.

HTH

--
Y.D.

Avatar
Olivier Miakinen

mais qu'il attende que la page soit chargée avant d'executer le JS n'est
pas plus mal non ?
si le JS appelle un element tout en bas de la page, par exemple.


Oui. Mais je n'avais pas dû être très clair : la page est complètement
chargée avant que j'appelle le JavaScript sur évènement « onload ». Cela
dit, l'explication que donne YD est convaincante, et sa solution me
semble prometteuse. Je vais essayer dès que possible.

Avatar
Olivier Miakinen

Le comportement "normal" pour le navigateur est d'attendre que le script
rende la main pour effectuer le rafraîchissement de l'affichage. Peut-être
que dans ton cas le fait que le script appelle une applet Java est
interprété comme une pause par IE qui en profite pour actualiser l'affichage ?


Déjà, ça me rassure quelque part que ce soit IE qui soit bugué et pas
Netscape 7 ou Firefox : quitte à faire des contournements de bugs, je
préfère qu'ils concernent un seul navigateur.

Une solution possible serait [...] de ruser avec des setTimeout().

[exemple]

La pause de 20 ms entre les différentes étapes devrait permettre au navigateur de
rafraîchir l'affichage, le script se terminant alors avant de se relancer pour
l'étape suivante.


Ça me semble excellent ! J'essaye demain, dès que possible, et je
reviens pour dire si ça marche.

Avatar
YD

Ça me semble excellent ! J'essaye demain, dès que possible, et je
reviens pour dire si ça marche.


Un petit feedback ?

--
Y.D.

Avatar
Olivier Miakinen

[timeout pour permettre le rafraîchissement de l'affichage ]

Ça me semble excellent ! J'essaye demain, dès que possible, et je
reviens pour dire si ça marche.


Un petit feedback ?


Je promets de le faire dès que j'aurai essayé, malheureusement ce n'est
pas encore le cas. J'essaye de gérer au mieux les différentes priorités,
et cette tâche s'est retrouvée un peu moins prioritaire que d'autres.

Peut-être la semaine prochaine (je travaillerai trois jours), sinon la
première semaine de janvier.

--
Olivier Miakinen
Non, monsieur le juge, je vous le jure : jamais je n'ai cité
Bruxelles dans ma signature.


Avatar
Olivier Miakinen

Une solution possible serait de saucissonner le script en ses différentes
étapes, d'utiliser éventuellement des variables globales (pour la variable
the_applet par ex.) et de ruser avec des setTimeout(). [...]

switch(etape){
case 0:
affiche(msg1);
setTimeout("lafonction(" + ++etape +")",20);
break;


Modulo des « window.setTimeout() » au lieu de « setTimeout() », cela
marche finement. Un grand merci pour ce cadeau de Noël !

--
Olivier Miakinen
Non, monsieur le juge, je vous le jure : jamais je n'ai cité
Bruxelles dans ma signature.

Avatar
YD

Une solution possible serait de saucissonner le script en ses différentes
étapes, d'utiliser éventuellement des variables globales (pour la variable
the_applet par ex.) et de ruser avec des setTimeout(). [...]

switch(etape){
case 0:
affiche(msg1);
setTimeout("lafonction(" + ++etape +")",20);
break;



Modulo des « window.setTimeout() » au lieu de « setTimeout() »,


Ah ? Il me semble que window n'est quasiment jamais obligatoire car
il correspond à l'objet Global dans le navigateur et est donc sous-entendu.

cela
marche finement. Un grand merci pour ce cadeau de Noël !


De rien ! Et merci d'avoir donné le résultat.

--
Y.D.


1 2