Si vous utilisez FireFox (et je suis assez sûr que la plupart des autres navigateurs que IE), il est en effet un moyen de signaler combien de données ont été transférées au cours d'une opération XHR. Si l'opération en question envoie l'en-tête correct, il est assez facile d'utiliser cette information pour calculer le pourcentage de données téléchargées.
J'ai écrit ce code pour déterminer le pourcentage de données transférées dans une opération XHR il y a des années, donc je m'excuse pour cela ne reflétant pas les années d'expérience de codage que j'ai acquise depuis. Je ne serais certainement pas l'écrire de cette façon maintenant! Pourtant, j'ai réussi à le pêcher, et j'espère que c'est utile pour vous.
Au moment où cela a été écrit, IE7 était la dernière version d'Explorer disponible, et je me souviens que le code ne fonctionnait pas dans ce sens, d'où il contient du code pour l'empêcher d'initialiser sous IE. Je n'ai jamais essayé ce code sous la version 8 ou la version bêta de la version 9, et il peut effectivement fonctionner dans ces versions, mais je ne peux pas le garantir. Si vous pouvez le faire fonctionner dans une nouvelle version d'IE, s'il vous plaît faites le moi savoir! Il fonctionne en exécutant le code dans beforeSend (un rappel jQuery fournit le code que vous voulez exécuter avant de lancer une requête ajax) pour configurer un intervalle Javascript (dans le code que j'ai mis 50 miliseconds, ce qui est probablement trop souvent 200 millisecondes devraient toujours être abondantes, et mettre moins de pression sur le système). Chaque fois que le temporisateur d'intervalle se déclenche, il exécute une fonction qui examine l'attribut responseText de la requête XHR. L'attribut responseText contient le texte brut des données reçues jusqu'à présent. En comptant le nombre de caractères présents avec la méthode string length(), nous pouvons déterminer le nombre d'octets collectés jusqu'à présent.
Pour calculer le pourcentage de données totales à envoyer, votre code côté serveur doit envoyer un en-tête de longueur de contenu avec un décompte précis du nombre d'octets qu'il va envoyer. Cela nécessitera un peu d'intelligence de votre part, mais ne devrait pas s'avérer trop difficile. Si vous envoyez un en-tête de longueur de contenu précis, il est utilisé pour calculer un pourcentage de données reçues jusqu'à présent. Si vous ne définissez pas d'en-tête de contenu, la quantité de données reçues jusqu'à présent s'affiche à la place.
<script type="text/javascript">
$.ajax ({
beforeSend : function (thisXHR)
{
// IE doesn't support responseText access in interactive mode
if (!$.browser.msie)
{
myTrigger = setInterval (function()
{
if (thisXHR.readyState > 2)
// When there is partial data available use it to determine how much of the document is downloaded
{
var dlBytes = thisXHR.responseText.length;
if (totalBytes == -1)
totalBytes = thisXHR.getResponseHeader ('Content-length');
(totalBytes > 0)?
$('#progress').html (Math.round ((dlBytes/totalBytes) * 100) + "%"):
$('#progress').html (Math.round (dlBytes/1024) + "K");
}
}, 50); // Check the status every 50 miliseconds
}
},
complete : function()
{
// Kill the download progress polling timer
if (myTrigger)
clearInterval (myTrigger);
}
});
</script>
Il pourrait y avoir une douzaine de façons différentes de le faire. Cela dépend de ce que fait le script PHP et du type de technologie côté serveur que vous avez. Peux-tu être plus précis? – mellowsoon
Le script exécute des requêtes et utilise les données pour générer du code html, que le gestionnaire de réponse xmlhttprequest insère sur la page en cours. – Evan4623