XMLHttpRequest Level 2 简称XHR2添加了ProgressEvent接口,使得可以不借助第三方插件,使用原生Javascript就可以实现上传下载进度监控。
下载的progess事件由XMLHttpRequest对象自身触发,而上传的progess由XMLHttpRequest.upload对象触发。
使用原生的Javascript可以这样写:
1 2 3 4 5
| var xhr = new XMLHttpRequest();
xhr.addEventListener("progress", download_progress_handler, false);
xhr.upload.addEventListener("progress", upload_progress_handler, false);
|
如果使用JQuery则需要一些曲折,因为JQuery没有对上传下载进度监控提供直接的支持。但是$.ajax函数提供了xhr和xhrFields配置接口,可以修改JQuery内部使用的XMLHttpRequest对象的属性,甚至可以提供自己的XMLHttpRequest对象供JQuery使用。
所有有了以下两种方式来配置$.ajax实现进度监控:
使用xhr配置
1 2 3 4 5 6 7 8 9 10 11 12
| $.ajax({ xhr: function() { var xhr = $.ajaxSettings.xhr(); xhr.addEventListener('progress', download_progress_handler, false); xhr.upload.addEventListener('progress', upload_progress_handler, false); return xhr; } });
|
使用xhrFields配置
1 2 3 4 5 6 7 8 9 10 11 12
| $.ajax({ xhrFields: { onsendstart: function() { this.addEventListener('progress', download_progress_handler, false); this.upload.addEventListener('progress', upload_progress_handler, false); } } });
|
进度事件处理函数
此时的事件对象为ProgressEvent
1 2 3 4 5 6 7 8
| function upload_progress_handler (e) { if (e.lengthComputable) { var percentComplete = e.loaded / e.total; } else { } }
|
References:
[1]Using XMLHttpRequest
[2]jQuery+FormData+文件上传+上传进度
===
[erq]