Si está utilizando FireFox (y estoy bastante seguro de que la mayoría de los otros navegadores aparte de IE), de hecho hay una manera de informar cuántos datos se han transferido durante una operación XHR. Si la operación en cuestión envía el encabezado correcto, es bastante fácil utilizar esta información para calcular el porcentaje de los datos descargados.
Escribí este código para determinar el porcentaje de datos transferidos en una operación XHR hace años, así que me disculpo por ello y no refleja los años de experiencia en codificación que he adquirido desde entonces. ¡Casi seguro que no lo escribiría de esta manera ahora! Aún así, logré pescarlo, y espero que te sirva.
En el momento en que esto fue escrito, IE7 era la última versión de Explorer disponible, y recuerdo que el código no funcionó en eso, por lo tanto, contiene código para evitar que se inicialice en IE. Nunca he probado este código en la versión 8 o beta de la versión 9, y de hecho también puede funcionar en esas versiones, pero no puedo responderlo. Si puede hacerlo funcionar en una nueva versión de IE, ¡por favor hágamelo saber!
Funciona mediante la ejecución de código en beforeSend (una jQuery de devolución de llamada proporciona el código que desea ejecutar antes de iniciar una solicitud ajax) para configurar un intervalo de Javascript (en el código he puesto 50 milisegundos, que probablemente sea demasiado a menudo, 200 milisegundos todavía deberían ser suficientes y ejercer menos presión sobre el sistema). Cada vez que se dispara el temporizador de intervalo, ejecuta una función que mira el atributo responseText de la solicitud XHR. El atributo responseText contiene el texto sin formato de los datos recibidos hasta el momento. Contando cuántos caracteres hay con el método de cadena length(), podemos calcular cuántos bytes se han recopilado hasta ahora.
En cuanto a calcular el porcentaje de datos totales que se enviarán, esto requerirá que su código del lado del servidor envíe un encabezado de longitud de contenido con un recuento exacto de cuántos bytes va a enviar. Esto requerirá un poco de astucia de su parte, pero no debe resultar demasiado difícil. Si envía un encabezado preciso de longitud de contenido, entonces se usa para calcular un porcentaje de los datos recibidos hasta el momento. Si no configura un encabezado de contenido, entonces se mostrará la cantidad de datos recibidos hasta el momento.
<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>
Puede haber una docena de formas diferentes de hacerlo. Depende de qué está haciendo el script PHP y qué tipo de tecnología del lado del servidor tiene. ¿Puedes ser mas específico? – mellowsoon
La secuencia de comandos ejecuta consultas y usa los datos para generar código html, que el controlador de respuestas xmlhttprequest inserta en la página actual. – Evan4623