我在以下代码中获取了错误的文件名。我确定这显然是错误的,但我没有看到它。我得到了正确数量的错误,但所有文件名都是相同的,而不是错误的文件名。
for(var i=0; i<this.files.length; ++i){
var f = this.files[i];
var reader = new FileReader();
reader.onload = function(e) {
if(e.total>maxFilesize){
tooBigFilesLs.push(f.name);
答案 0 :(得分:2)
我认为这是一个关闭问题与您的for循环。
Here是如何处理它的一个例子。
// Basic idea...
reader.onload = (function(value) {
return function() {
alert(value);
}
})(f.name);
答案 1 :(得分:2)
在“创建循环中的闭包:一个常见的错误”
中的那篇文章中只有一个例子试试这个:
for(var i=0; i<this.files.length; ++i){
var f = this.files[i];
var reader = new FileReader();
(function(name){
reader.onload = function(e) {
if(e.total>maxFilesize){
tooBigFilesLs.push(name);
}
}
}(f.name));
}
(未经测试)
基本上,当您在'onload'上定义该函数时,您正在创建一个闭包,并且您在该循环中创建的所有函数都共享它,因此所有函数都可以访问'f'和'reader',所以' f'将继续指向循环中的最后一个文件。在我的示例中添加匿名闭包,使用'name'参数,确保'onload'中的函数获得正确的名称。