• 记录addEventListener获取上传文件进度的坑


    在做上传文件的时候,想要在上传时把每个文件的进度条显示出来,于是找到了addEventListener这个方法,这里记录一下在实现进度条的过程中遇到的坑。

    直接上JS代码

    var files = $("#upload")[0].files
    for (var i = 0; i < files.length; i++ ) {
    	var formData = new FormData();
        formData.append("file", files[i]);
        $.ajax({
          url: url,
          type: 'POST',
          data: formData,
          processData: false,
          contentType: false,
          xhr: function() {
            var xhr = new XMLHttpRequest();
            //使用XMLHttpRequest.upload监听上传过程,注册progress事件,打印回调函数中的event事件
            xhr.upload.addEventListener('progress', function(e){
              var progressRate = Math.round((e.loaded / e.total) * 100) + '%';
              //通过设置进度条的宽度达到效果
              console.log(`fileName:', files[i].name, uploaded:', progressRate);
            });
              return xhr;
          },
          success: function (arg) {
              console.log(arg)
          },
          error : function (responseStr) {
              console.log(responseStr.responseJSON)
              continue
          }
        });
    }
    

    出现的问题:

    刚开始用以上代码执行上传多个文件,:xhr 中的 files[i].name 不正确,例如我上传文件 a.jpg b.jpg c.jpg ,最后的输出结果都是 fileName:c.jpg uploaded: xx%

    原因是:
    xhr:中的 files[i].name 受循环的影响,无论有循环多少次,这里的i总是显示最后循环的一个数。

    解决方法一:
    将for循环中的var i 换成 let i,这样在下面的循环中,每个循环都会使用各自的i,不会受循环的影响从而改变i的值。

    解决方法二:
    把 ajax 的代码放在一个闭包里,将i作为参数传入。

    var files = $("#upload")[0].files
    for (var i = 0; i < files.length; i++ ) {
    	function upload(){
    		var formData = new FormData();
    		formData.append("file", files[i]);
    		
    		function close(i){
    		  $.ajax({
    		    url: url,
    		    type: 'POST',
    		    data: formData,
    		    processData: false,
    		    contentType: false, 
    		    xhr: function() {
    		      var xhr = new XMLHttpRequest();
    		      xhr.upload.addEventListener('progress', function(e){
    		        var progressRate = Math.round((e.loaded / e.total) * 100) + '%';
    		        //通过设置进度条的宽度达到效果
    		        console.log(`fileName:', files[i].name, uploaded:', progressRate);
    		      });
    		      return xhr;
    		    },
    		    success: function (arg) {
    		        console.log(arg)
    		    },
    		    error : function (responseStr) {
    		        console.log(responseStr.responseJSON)
    		    }
    		  });
    		}
    		return close
    	}
    	close = upload();
    	close(i);
    }
    
  • 相关阅读:
    JQuery缓冲加载图片插件lazyload.js的使用方法
    CSS3阴影 box-shadow的使用和技巧总结
    HTML符号大全
    TouchSlide
    响应式图片的3种解决方案
    ECMAScript arguments 对象
    call() 方法 和 apply()方法详解
    字体图标 iconfont cssfont
    响应式样式
    1-微信小程序创建项目
  • 原文地址:https://www.cnblogs.com/ray-h/p/12360419.html
Copyright © 2020-2023  润新知