Для загруженных байтов это довольно просто. Просто следите за событием xhr.upload.onprogress
. Браузер знает размер файлов, которые он должен загрузить, и размер загруженных данных, поэтому он может предоставить информацию о ходе выполнения.
Для загруженных байтов (при получении информации с помощью xhr.responseText
) это немного сложнее, потому что браузер не знает, сколько байтов будет отправлено в запросе сервера. Единственное, что браузер знает в этом случае, это размер байтов, которые он получает.
Существует решение для этого, достаточно установить заголовок Content-Length
в скрипте сервера, чтобы получить общий размер байтов, которые браузер собирается получить.
Для получения дополнительной информации перейдите к https://developer.mozilla.org/en/Using_XMLHttpRequest.
Пример:
Мой серверный скрипт читает zip-файл (это занимает 5 секунд):
$filesize=filesize('test.zip');
header("Content-Length: " . $filesize); // set header length
// if the headers is not set then the evt.loaded will be 0
readfile('test.zip');
exit 0;
Теперь я могу следить за процессом загрузки серверного скрипта, потому что я знаю, что его общая длина:
function updateProgress(evt)
{
if (evt.lengthComputable)
{ // evt.loaded the bytes the browser received
// evt.total the total bytes set by the header
// jQuery UI progress bar to show the progress on screen
var percentComplete = (evt.loaded / evt.total) * 100;
$('#progressbar').progressbar( "option", "value", percentComplete );
}
}
function sendreq(evt)
{
var req = new XMLHttpRequest();
$('#progressbar').progressbar();
req.onprogress = updateProgress;
req.open('GET', 'test.php', true);
req.onreadystatechange = function (aEvt) {
if (req.readyState == 4)
{
//run any callback here
}
};
req.send();
}