进度条不会在文件上传中更新其宽度

时间:2016-04-18 01:59:06

标签: javascript html file uploading

我正在上传文件并显示每个加载的进度条,但它仅适用于一个进度条。

在html中,

   <input type="file" id="file-input" multiple>
   <div id="file-list">
   </div>

在Javascript中,

$('#file-input').change(function(e) {

for (var i = 0, f; f = files[i]; i++) {

    var reader = new FileReader();
    reader.readAsBinaryString(f);

    reader.onloadstart = function (e) {
      var text = '<div><div id="progress_bar" class="loading"><div class="percent">0%</div></div></div>';
      $('#file-list').append(text);
    }

    reader.onload = function(e) {
       var progress = document.querySelector('.percent');
       progress.style.width = '100%'; // replacing with percentage
       progress.textContent = '100%';
    }
 }

});

一次上传三个文件的结果是显示一个100%的进度条和0%的两个条。这有什么问题?

1 个答案:

答案 0 :(得分:1)

您可以在f循环之外定义for,调整for循环以包含条件i < f.length;将i传递给IIFE,为每次调用FileReader创建一个单独的范围。

$("#file-input").change(function(e) {
  var f = e.target.files;
  for (var i = 0; i < f.length; i++) {
    (function(n) {
      var reader = new FileReader();
      reader.readAsBinaryString(f[n]);

      reader.onloadstart = function(e) {
        var text = "<div><div class=loading><div class=percent-" 
                   + n + ">0%</div></div></div>";
        $("#file-list").append(text + "<br>");
      }

      reader.onload = function(e) {
        var progress = $(".percent-" + n);
        progress.css("width", "100%"); // replacing with percentage
        progress.text("100%");
      }
    }(i))
  }
});
[class^="percent"] {
  width: 1%;
  height: 24px;
  background: green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<input type="file" id="file-input" multiple>
<div id="file-list">
</div>

另见Upload multiple image using AJAX, PHP and jQuery