【问题标题】:progress bar not updating its width in file uploads进度条未在文件上传中更新其宽度
【发布时间】:2016-08-09 14:56:18
【问题描述】:

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

在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%。这有什么问题?

【问题讨论】:

  • 是否需要显示每个File 对象的进度?另见stackoverflow.com/questions/19871627/…FileReader 是异步的。第二个文件上传不会等待第一个文件上传完成才开始
  • 是的,我想显示每个正在上传的文件的进度。谢谢。

标签: javascript html file uploading


【解决方案1】:

您可以在for 循环之外定义f,调整for 循环以包含条件i &lt; 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

【讨论】:

猜你喜欢
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
  • 2011-12-17
相关资源
最近更新 更多