tfeserver : Blog de tfe

Je fais partager ici un petit script que j'ai codé pour créer une petite barre de chargement d'un fichier en php/javascript.
Le principe est plutôt simple:
  • La page appelle le fichier via xmlhttpRequest
  • Le fichier que l'on appelle va se charger de temporiser la sortie, de faire de temps en temps de flush afin de nous informer de l'etat de l'avancée de l'envoie.
  • Le script JS va recevoir au fur et à mesure ces données, et montrer l'état d'avancement dans la barre de chargement.

Si le fichier cible n'a pas renseigné l'entête HTTP Content-Length, le script JS avancera de 1% à chaque fragment reçu.

Il ne s'agit bien sûr que d'un exemple de script, dont vous pouvez vous inspirer au besoin. Il est basé sur la librairie javascript prototype, que vous pouvez récuperer sur le site officiel.

Le script:

function creation_barre_chargement( lien)
{
// Creation du fond grisé
var back= document.createElement('DIV');
back.style.position='absolute';
back.style.top='0px';
back.style.left='0px';
back.style.width='100%';
back.style.height='100%';
back.style.background='white';
back.style.opacity='0.8';
back.style.filter='alpha(opacity=80)';

// Creation de la barre de chargement
var div= document.createElement('DIV');
div.style.position='absolute';
div.id='barre_chargement';
div.style.width='40%';
div.style.marginLeft='30%';
div.style.marginTop='10%';
div.style.border="1px solid black";
div.style.background="#d0d0d0";
div.style.height='20px';

// Creation de l'avancement de la barre de chargement
var p= document.createElement('P');
p.style.margin='0px';
p.style.width='0px';
p.style.padding='0px';
p.style.borderLeft='1px solid #333';
p.style.height='100%';
p.style.background='green';
p.style.fontWeight='bold';
p.id='pourcentage_accompli';
p.style.textAlign='right';

// Texte de l'avancement de la barre de chargement
var txt= document.createTextNode('0%');

// Ajout des elements DOM
p.appendChild(txt);
div.appendChild(p);
back.appendChild(div);
document.body.appendChild(back);

// Gestion de la récuperation du fichier
myAjax=new Ajax.Request( lien.href, {
method: 'get',
onInteractive : function(response)
{
if(response.getHeader('Content-Length')!='')
{
var pourcentage=$('pourcentage_accompli').getWidth()/$('barre_chargement').getWidth()*100;
pourcentage+=1;
}
else
{
var pourcentage= myAjax.transport.responseText.length/response.getHeader('Content-Length')*100;
}
if(pourcentage>100)
{
pourcentage=0;
}
$('pourcentage_accompli').style.width=pourcentage+'%';
$('pourcentage_accompli').firstChild.nodeValue=pourcentage.toFixed(2)+'%';
},
onSuccess: function() {
document.location.href='#'+lien.href;
document.body.update(myAjax.transport.responseText);
}
});
}

Event.observe(window, 'load', function()
{
$$('.loading_item').each(
function(item)
{
item.onclick= function() { creation_barre_chargement(item); return false; }
}
);
});

Un exemple d'appel  est disponible sur cette page: barre de chargement pourcentage en javascript.
Source du fichier test.php:

$html="
blah blah blah
bah blah blah
bah blah blah
blah blah bla
blah blah bla
";

header("Content-Length:".strlen($html));

foreach(preg_split("/[\r\n]/",$html) as $v_text)
{
print "$v_text\n";
flush();
sleep(1);
}

javascript ajax loading dhtml chargement pourcentage barre

kapouik

le 08/03/09 13:34:37

Je viens de voir l'exemple : c'est pas mal mais je ne vois pas trop l'intérêt à part pour alourdir une page web.

Bon niveau bug : quand tu charges une page avec ton script, si tu fais un retour en arrière, la page chargé reste à l'écran. Donc comme l'url change, il faut rafraîchir la page pour pouvoir l'afficher.

Bon sinon si tu pouvais faire pareil mais pour le traitement via le moteur php d'un script (qui serait utile pour des traitement de plusieurs seconde), là adhérerais directement !

infogirl

le 24/06/09 11:24:36

ce code est interessant mais la rédaction de cet article n'est pas évidente pour les débutants?!

- ou doit-on intégrer le code .js? dans une page appart ou dans la page contenant déjà des "function" .js s'il y a?
- A quel code correspond l'appel de la fontion pour obtenir le résultat donné en exemple?
- A quoi correspond test.php?

merci de votre réponse.

tfe

le 24/06/09 13:17:53

Bonjour infogirl,

En effet, faute de retour, il se peut que mes explications ne soient pas tres tres claires.

Pour l'ensemble du code javascript, il doit se trouver dans un fichier javascript nommé par exemple "chargement.js", que vous chargerez sur la page ou se situe le lien en question.

Sur la page sur laquelle vous developpez ce script, vous devrez avoir des liens classiques html.
Ils seront automatiquement gerés, une fois le script javascript chargé.

Pour toute question précise ou demande d'astuces, hesitez pas à me contactar par mail: tfe@tfeserver.be par exemple.


infogirl

le 24/06/09 13:28:03

ce code est interessant mais la rédaction de cet article n'est pas évidente pour les débutants?!

- ou doit-on intégrer le code .js? dans une page appart ou dans la page contenant déjà des "function" .js s'il y a?
- A quel code correspond l'appel de la fontion pour obtenir le résultat donné en exemple?
- A quoi correspond test.php?

merci de votre réponse.