Rafraichissement de l'écran pendant un script long

Signaler
Messages postés
189
Date d'inscription
vendredi 1 septembre 2006
Statut
Membre
Dernière intervention
30 avril 2021
-
Bonjour,

J'ai une page qui contient un (très) grand nombre de Div masqués, représentant une arborescence complète dont les nœuds du niveau supérieur sont au départ les seuls affichés.
Quand on clique sur un nœud affiché, le contenu du nœud se développe en démasquant le div contenu, etc.
Les div sont identifiés par une classe spécifique servant à les manipuler avec JQuery.

Quand on clique individuellement sur un nœud, tout va bien.
Cependant, si on clique sur le bouton "Tout afficher", la commande JQuery exécute une boucle qui fait un show() sur les classe de nœud.

Quand le nombre de nœuds est important et la profondeur de l’arborescence importante, le navigateur met plusieurs dizaines de secondes à "digérer" la commande. Et encore, je suis sur une machine très puissante. J'imagine ce que ça peut donner sur une machine un peu lente.

Pour faire patienter l'utilisateur, j'utilise une image de sablier animé qui vient se placer au centre de l'écran pendant la "digestion". Ce système fonctionne très bien en d'autres circonstances (notamment pendant les appels Ajax), mais pas dans le cas où je lance la boucle.
Dans le cas présent, le code affiche l’image, exécute la boucle et efface l’image. Seulement voilà, l’écran n’est pas rafraichi pendant toute la routine, ce qui fait que l’image n’apparaît que brièvement en fin de boucle pour être aussitôt effacée.

Pour que ce soit plus clair, voici le code de la boucle (waitOn affiche le sablier et waitOff l’efface) :
$('#opendirs').click(function()
{
	waitOn();
	$.each($('.dir'), function()
	{
		if(this.id.match(/^rep_[0-9]+/))
		{
			var $what = this.id.substr(4, this.id.length);
			var $bloc = $('#fld_' + $what);
			var $files = $bloc.children('.filedata');
			$bloc.show("fast");
			$files.hide();
			if($bloc.children(':visible').length > 0)
				$('#img_' + $what).attr('src', 'fldron.gif');
			else if($bloc.children().length > 0)
				$('#img_' + $what).attr('src', 'fldrplus.gif');
			else
				$('#img_' + $what).attr('src', 'fldroff.gif');
		}
	});
	waitOff();
});


Ce qu'il me faudrait, c'est une commande de rafraichissement de l'écran, comme avec Refesh() en C# ou DoEvents() en VB6, à placer juste après waitOn()..

Existe-t-il une commande équivalente en Javascript ou JQuery, ou un système permettant de « rendre la main » au système le temps de l’affichage de l’image ?