【问题标题】:Image preview and name on multiple upload多次上传时的图像预览和名称
【发布时间】:2014-05-20 09:44:48
【问题描述】:

我正在尝试在使用 ajax 上传之前显示图像的预览和名称。我使用 File Read API 显示预览,同时使用“.name”方法显示文件名,问题是它显示所有预览但所有图像都具有相同的名称,最后一个文件名。谢谢!

$('input').change(function(){
    for (var i=0; i<this.files.length; i++){
        var reader = new FileReader()
        reader.onload = function (e) {
            $('ul').append('<li><img src="'+e.target.result+'">'+this.files[i].name+'</li>')
        }
        reader.readAsDataURL(this.files[i]) 
    }

})

【问题讨论】:

  • 嘿,我认为这是一个“竞争条件”,您的循环在 FileReader 完成加载之前完成。是否可以改为通过 e 参数访问文件名?

标签: jquery image-uploading readfile


【解决方案1】:

创建一个新的作用域(闭包)以保持i 的值,因为当异步onload 处理程序触发时,循环已经结束,i 的值将是最后一组,将它传递给 IIFE 解决了这个问题

$('input').change(function () {
    for (var i=0, len = this.files.length; i < len; i++) {
        (function (j, self) {
            var reader = new FileReader()
            reader.onload = function (e) {
                $('ul').append('<li><img src="' + e.target.result + '">' + self.files[j].name + '</li>')
            }
            reader.readAsDataURL(self.files[j])
        })(i, this);
    }
});

FIDDLE

【讨论】:

  • 完美,就是我想要的!谢谢:)
  • 您好,我用过这个,但它在 PC 上完美运行,但在移动设备上不可用
【解决方案2】:

在 Javascript 中,for 循环迭代器变量并不真正在 for 循环的范围内。

this example 中,变量“i”在循环运行结束后仍将是“5”:

arrTest = [1,2,3,4,5];
for (var i=0; i<arrTest.length; i++){
    console.log(i);
}
alert(i);

由于这个怪癖,在 Javascript 中编写这样的 for 循环是一种最佳实践:

var i;
for (i=0; i<arrTest.length; i++){
    console.log(i);
}

因此,由于 for 循环变量的作用域,您正在运行“竞争条件”。你可以通过那个“e”参数来访问文件名吗?

【讨论】:

  • 我尝试使用“e”参数显示名称,但结果是“未定义”
  • 我检查了文档,但这不起作用。请参阅此 Q&A 以获取有关一一加载多个文件的帮助:stackoverflow.com/questions/13975031/… - 如果您一次阅读一个,那么您将能够在循环中访问每个文件的数据,例如“名称”。
  • 对不起,但是阅读你给我的页面无法理解递归函数的哪个部分使用了文件名。谢谢!
  • @LukasKas - 这甚至不接近问题所在,在循环外声明 var 与 for 语句内完全相同,这不是竞争条件,而是范围问题.
  • @adeneo 您的解决方案很好。我会以与您不同的方式解决它,但我应该尝试使用闭包一次。
猜你喜欢
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
相关资源
最近更新 更多