Filereader.Onload 开火太早
Filereader.Onload fired too early
我尝试读取由输入类型文件(多个)上传的文件。代码如下:
$(document).ready(function() {
$('#convert').on('click', function() {
var files=$('#files')[0].files;
if (!files) return;
for (var i=0; i<files.length; i++) {
var file=files[i];
fr = new FileReader();
fr.onload = (function(received) {
var note=$(fr.result);
});
fr.readAsText(file);
}
});
});
现在我的问题是:
"onload" - 函数甚至在文件加载之前就被调用了。 note
从来没有任何内容。但是当我在 note
- 行之前放置一个断点并等待一段时间时,note
获取内容。
看来,onload() 事件调用得太早了。我该怎么办?
(浏览器是 Chrome)
您正在使 fr
成为一个全局变量,并且在 onload 触发时,由于循环
,它将成为与您预期不同的对象
尝试将其包装在 IIFE 中以创建闭包并使 fr
成为局部变量
for (var i = 0; i < files.length; i++) {
(function(file) {
var fr = new FileReader();
fr.onload = function(received) {
var note = $(fr.result);// not sure what intent is here
};
fr.readAsText(file);
})(files[i])
}
我用 this.result
替换了 fr.result
:
fr.onload = (function() {
var note=$(this.result);
});
成功了
我尝试读取由输入类型文件(多个)上传的文件。代码如下:
$(document).ready(function() {
$('#convert').on('click', function() {
var files=$('#files')[0].files;
if (!files) return;
for (var i=0; i<files.length; i++) {
var file=files[i];
fr = new FileReader();
fr.onload = (function(received) {
var note=$(fr.result);
});
fr.readAsText(file);
}
});
});
现在我的问题是:
"onload" - 函数甚至在文件加载之前就被调用了。 note
从来没有任何内容。但是当我在 note
- 行之前放置一个断点并等待一段时间时,note
获取内容。
看来,onload() 事件调用得太早了。我该怎么办?
(浏览器是 Chrome)
您正在使 fr
成为一个全局变量,并且在 onload 触发时,由于循环
尝试将其包装在 IIFE 中以创建闭包并使 fr
成为局部变量
for (var i = 0; i < files.length; i++) {
(function(file) {
var fr = new FileReader();
fr.onload = function(received) {
var note = $(fr.result);// not sure what intent is here
};
fr.readAsText(file);
})(files[i])
}
我用 this.result
替换了 fr.result
:
fr.onload = (function() {
var note=$(this.result);
});
成功了