(function addXhrProgressEvent($) { var originalXhr = $.ajaxSettings.xhr; $.ajaxSetup({ progress: function() { console.log("standard progress callback"); }, xhr: function() { var req = originalXhr(), that = this; if (req) { if (typeof req.addEventListener == "function") { req.addEventListener("progress", function(evt) { that.progress(evt); },false); } } return req; } }); })(jQuery); // usage: // note, if testing locally, size of file needs to be large enough // to allow time for events to fire $.ajax({ url: "./json.js", type: "GET", dataType: "json", complete: function() { console.log("Completed."); }, progress: function(evt) { if (evt.lengthComputable) { console.log("Loaded " + parseInt( (evt.loaded / evt.total * 100), 10) + "%"); } else { console.log("Length not computable."); } } });