【问题标题】:XHR multiple file upload with progressbar带进度条的 XHR 多文件上传
【发布时间】:2012-09-24 15:17:21
【问题描述】:

我正在通过输入 type="file" 和 XHR 请求上传文件。上传进行得非常顺利。问题是,我无法使用 onprogress 更新我的进度条。如果我只上传一个文件,它工作得很好,但由于不止一个,只有一个进度条被更新,其他的根本不起作用。它可能来自 for 循环,但我不明白如何我可以解决这个问题如果有人有想法,那就太好了!

代码如下:

$('input').change(function() {

var allowedTypes = ['png', 'jpg', 'jpeg', 'gif'];   
var filesLen = this.files.length;
var fileInput = document.querySelector('#file');

for (i = 0; i < filesLen; i++)
{
    var vidType = this.files[i].name.split('.');

    if (allowedTypes.indexOf(vidType[vidType.length -1].toLowerCase()) != -1)
    {
        var progress = 'progress' + i;

        $('input').before('<p>' + this.files[i].name + ' <progress id="' + progress + '"></progress></p>');

        var xhr = new XMLHttpRequest();

        xhr.open('POST', '/upload/');

        xhr.upload.onprogress = function(e) 
        {
            $('#' + progress).attr('value', e.loaded);
        $('#' + progress).attr('max', e.total);
        };

        xhr.onload = function()
        {
            console.log('upload complete');
        };

        var form = new FormData();
        form.append('title', this.files[i].name);
        form.append('pict', fileInput.files[i]);

        xhr.send(form);

    }

    else
    {
        alert('Your file "' + this.files[i].name + '" \'s format isn\'t supported');    
    }
}

【问题讨论】:

标签: javascript jquery file-upload xmlhttprequest progress-bar


【解决方案1】:

这就是“臭名昭著的循环问题”。

问题出在这里:

xhr.upload.onprogress = function(e) 
{
    $('#' + progress).attr('value', e.loaded);
    $('#' + progress).attr('max', e.total);
};

当这个函数运行时,progress 将是循环退出时的样子,而不是循环中定义函数时的样子。尝试用以下代码替换该代码:

(function(progress) { 
    xhr.upload.onprogress = function(e) 
    {
        $('#' + progress).attr('value', e.loaded);
        $('#' + progress).attr('max', e.total);
    };
}(progress));

更多:Javascript infamous Loop issue?

【讨论】:

  • 成功了,非常感谢!我对 JS 很陌生,我从未听说过这个“臭名昭著的循环问题”。现在经过快速研究,我已经理解了这个问题:“JavaScript 的作用域是函数级的,而不是块级的,创建闭包只是意味着封闭作用域被添加到封闭函数的词法环境中。”这就是为什么匿名函数摆脱了这个臭名昭著的循环问题。再次感谢您,您刚刚让我从头疼中解脱出来!
  • @user1717735,没问题,很高兴它有帮助:)
猜你喜欢
  • 2015-10-19
  • 2013-05-21
  • 2011-09-11
  • 2011-10-07
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 2017-12-10
  • 2012-07-20
相关资源
最近更新 更多