There are a number of situations when you need to indicate a task progress. For example a file download, upload, plugin install or a simple AJAX request. It’s easy to display the progression using the HTML progress element and JavaScript to manipulate it values.

HTML PROGRESS ELEMENT

The <progress> element represents the completion progress of a task.
<progress id="progress" value="0"></progress>
HTML5 progress element supports following attributes:
  • max – specifies how much work the task requires in total. Must be a floating-point number > 0
  • value – specifies how much of the task has been completed. Must be a floating-point number >= 0 and <= max

PROGRESS EVENTS

Progress events supports following attributes:
  • lengthComputable – a read-only (Boolean) property indicating if the resource concerned by the ProgressEvent has a length that can be calculated
  • total – a read-only (Unsigned Long) property representing the total amount of work that the underlying process is in the progress of performing
  • loaded – a read-only (Unsigned Long) property representing the amount of work already performed by the underlying process
The following event handlers are supported for XMLHttpRequest and XMLHttpRequestUpload objects:
  • onloadstart – the request starts
  • onprogress – transmitting data
  • onabort – request has been aborted
  • onerror – the request has failed
  • onload – the request has successfully completed
  • ontimeout – the timeout has passed before the request completed
  • onloadend – the request has completed

UPLOAD PROGRESS

Now let’s use the ProgressEvent API to visualize the completion level of an AJAX Upload request.
<script type="text/javascript">
var progressBar = document.getElementById("progress"),
    xhr = new XMLHttpRequest();
xhr.open("POST", "https://zinoui.com/demo/progress-bar/upload.php", true);
xhr.upload.onprogress = function (e) {
    if (e.lengthComputable) {
        progressBar.max = e.total;
        progressBar.value = e.loaded;
    }
}
xhr.upload.onloadstart = function (e) {
    progressBar.value = 0;
}
xhr.upload.onloadend = function (e) {
    progressBar.value = e.loaded;
}
xhr.send(new FormData());
</script>
The ratio of work done can be calculated with the ProgressEvent loaded and total properties.
xhr.upload.onprogress = function (e) {
    if (e.lengthComputable) {
        var ratio = Math.floor((e.loaded / e.total) * 100) + '%';
        console.log(ratio);
    }
}

DEMO

DOWNLOAD PROGRESS

A practical example of progression for file downloads through XMLHttpRequest interface.
var xhr = new XMLHttpRequest();
xhr.open("GET", "https://zinoui.com/demo/progress-bar/test.csv?" + Math.floor(Math.random() * 99999), true);
xhr.responseType = "text";
xhr.onprogress = function(e) {
    if (e.lengthComputable) {
        progressBar.max = e.total;
        progressBar.value = e.loaded;
    }
};
xhr.onloadstart = function(e) {
    progressBar.value = 0;
};
xhr.onloadend = function(e) {
    progressBar.value = e.loaded;
};
xhr.send(null);

BROWSER COMPATIBILITY

Chrome 8+, Firefox 6+, IE10+, Opera 11.5+, Safari 6+