jQuery实现H5上传文件进度条
jQuery默认使用的XMLHttpRequest对象(下文简称xhr)是内部生成的,要知道上传进度我们就要监听其xhr对象的upload属性的变化。所以我们要解决的问题是“如何给jQuery默认生成的xhr对象绑定上我们自己写的监听函数”。
热心网友们想到了一个办法,首先封装一个方法 传入一个监听函数 返回一个绑定了监听函数的XMLHttpRequest对象。具体实现方法如下:
以下是完整代码:
来源:https://blog.csdn.net/qq_16371909/article/details/81000450
热心网友们想到了一个办法,首先封装一个方法 传入一个监听函数 返回一个绑定了监听函数的XMLHttpRequest对象。具体实现方法如下:
$.ajax({ type: "post", url: "上传路径", processData: false, data: {}, //关键部分,用xhrOnProgress方法监听xhr,并返回挂载了监听函数的新xhr对象 xhr: xhrOnProgress(function(e) { var percent = e.loaded / e.total;//计算百分比 console.log(percent); }), success: function(r) { console.log(r); } }); //上传进度监听方法 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; } }
以下是完整代码:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>AJAX上传文件进度条的实现原理</title> </head> <body> <input type="file" onchange="uploadFile()" /> </body> <!--这里要引用你自己的jquery喔 --> <script type="text/javascript" src="jquery-2.1.4.min.js"></script> <script> function uploadFile(event) { var e = window.event || event; var oFile = e.target.files[0]; var oData = new FormData(); oData.append("file", oFile); //上传进度监听方法 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({ type: "post", url: "",//这里加上你自己的上传地址 processData: false,//关闭jquery对文件的预处理 data: oData, xhr: xhrOnProgress(function(e) { //关键数据 /*稍微处理一下,看看控制台的打印数据就是上传的进度, 想要看明白,就控制一下你的网速,在浏览器控制台的 Network选项里面可以选择网速,选择fast 3g就可以啦。*/ var percent = e.loaded / e.total; }), success: function(r) { console.log(r); } }); } </script> </html>
来源:https://blog.csdn.net/qq_16371909/article/details/81000450
评论