原理:javascript
給XMLHttpRequest對象的upload屬性綁定onprogress方法監聽上傳過程java
var xhr = new XMLHttpRequest(); xhr.upload.onprogress = function(e) {}jquery
由於jQuery默認使用的XMLHttpRequest對象是內部生成的沒法直接給jq的xhr綁定onprogress方法ajax
因此只要給jQuery從新生成一個綁定了onprogress的XMLHttpRequest對象便可實現閉包
首先封裝一個方法 傳入一個監聽函數 返回一個綁定了監聽函數的XMLHttpRequest對象函數
var xhrOnProgress=function(fun) { xhrOnProgress.onprogress = fun; //綁定監聽 //使用閉包實現監聽綁 return function() { //經過$.ajaxSettings.xhr();得到XMLHttpRequest對象 var xhr = $.ajaxSettings.xhr(); //判斷監聽函數是否爲函數 if (typeof xhrOnProgress.onprogress !== 'function') return xhr; //若是有監聽函數而且xhr對象支持綁定時就把監聽函數綁定上去 if (xhrOnProgress.onprogress && xhr.upload) { xhr.upload.onprogress = xhrOnProgress.onprogress; } return xhr; } }
上傳時使用$.ajax方法url
var formData = new FormData(document.forms[0]);$.ajax({ url : url, type : 'POST', data : formData, //不處理表單數據 processData : false, //不處理contentType contentType : false, beforeSend:function(){ console.log("start transfer"); }, success : function(responseStr) { console.log(responseStr); }, error : function(responseStr) { console.log("error"); }, //用自定義的xhr代替jquery的xhr xhr:xhrOnProgress(function(e){ var percent=e.loaded / e.total;//計算百分比 }) });