【如何使用jQuery AJAX获得上载或下载的进度】尽管某些浏览器在屏幕的右下角显示进度, 但是你可能希望检索这些值并在项目中使用它们, 以向用户显示使用自己的UI进行下载或上传的进度。
为了使用ajax检索上载或下载(请求)的进度, 我们需要操作文档中的全局xhr(XMLHttpRequest)对象。
如果我们不使用jQuery(vanillaJS), 则该算法非常简单易懂:
function updateProgress(evt){
if (evt.lengthComputable){
var percentComplete = (evt.loaded / evt.total)*100;
console.log(percentComplete+"% completed");
}
}var request = new XMLHttpRequest();
request.onprogress=updateProgress;
onprogress事件将触发请求的updateProgress函数(下载和上传事件)
但是, 如果我们使用jQuery, 则需要使用可以在ajax结构中设置的xhr选项:
$.ajax({
xhr: function(){
var xhr = new window.XMLHttpRequest();
// Handle progress//Upload progressxhr.upload.addEventListener("progress", function(evt){if (evt.lengthComputable) {var percentComplete = evt.loaded / evt.total;
//Do something with upload progressconsole.log(percentComplete);
}}, false);
//Download progressxhr.addEventListener("progress", function(evt){if (evt.lengthComputable) {var percentComplete = evt.loaded / evt.total;
//Do something with download progressconsole.log(percentComplete);
}}, false);
return xhr;
}, complete:function(){
console.log("Request finished.");
}});
ProgressEvent.lengthComputable只读属性是一个布尔型标志, 指示资源是否具有可以计算的长度。如果不是, ProgressEvent.total属性将没有重大价值, 并且我们无法检索流程的进度, 在两种情况下, 都可以轻松地检索进度。
较旧的jQuery版本如果你使用的是jQuery < = 1.5, 则可能要使用以下代码, 因为这些版本不支持xhr属性。
$.ajax({type: 'POST', url: "/", data: {}, beforeSend: function(XMLHttpRequest){//Upload progressXMLHttpRequest.upload.addEventListener("progress", function(evt){if (evt.lengthComputable) {var percentComplete = evt.loaded / evt.total;
//Do something with upload progress}}, false);
//Download progressXMLHttpRequest.addEventListener("progress", function(evt){if (evt.lengthComputable) {var percentComplete = evt.loaded / evt.total;
//Do something with download progress}}, false);
}, success: function(data){//Do something success-ish}});
侦听器将直接附加到XMLHttpRequest对象, 该对象作为$ .ajax调用的beforeSend回调上的第一个参数检索。
推荐阅读
- 如何在使用jQuery的浏览器中长按键盘上显示额外的字符选择器
- 如何使用jQuery轻松创建二维码
- 如何解决gulp异常(参考错误primordials未定义错误)
- 如何使用Node.js混淆JavaScript代码
- 如何检查Node.js中是否存在活动的Internet连接
- 如何使用Node.js关闭和重启Linux
- 如何在Node.js中使用SSH2从UNIX服务器下载整个目录
- 找不到相对于目录的预设”es2015″和”react”
- Golang中用到的的Websocket库