【发布时间】:2015-05-30 15:20:54
【问题描述】:
FileReader.onload() 事件有一些问题:
我在以下两个代码 sn-ps 之间得到不同结果的原因是什么?只要我通过 object 实例,而不是显式的 this.attachmentIndex 值,我就会得到不同的结果。
1)
fileReader.onload = (function (file, obj) {
return function (evt) {
obj.attachmentIndex // 1
};
})(f, this);
2)
fileReader.onload = (function (file, index) {
return function (evt) {
index // 0
};
})(f, this.attachmentIndex);
关闭 - FileReader.onload()
我面临的另一个问题是我似乎无法将多个参数传递给我的FileReader.onload() 事件处理程序。
fileReader.onload = (function (file, one, two) {
return function (evt) {
one // 1
two // undefined
};
})(f, 1, 2);
你可以在下面找到整个对象。我不得不做一些丑陋的事情来实现我想要的。我真的希望有更好的方法来达到同样的效果。
function Note() {
this.attachmentOutput = [];
this.attachmentIndex = 0;
this.debugging = false;
this.currentWorkingObject = new NoteObject(helperFn.createGuid());
this.addAttachement = function(files) {
for (var i = 0, f; f = files[i]; i++) {
var fileReader = new FileReader(),
fileReader.onload = (function (file, obj) {
return function (evt) {
var base64File = evt.target.result;
obj["note"].addDataToAttachementObj(obj["index"], { data: base64File })
};
})(f, { note: this, index: this.attachmentIndex});
// Async => reading file
fileReader.readAsDataURL(f);
this.attachmentIndex++
}
var html = app.outputTemplate(this.currentWorkingObject.attachements);
$('.upload-output').html(html);
};
};
函数的触发器:
$(".upload-drop-zone").on('drop', function (e) {
e.preventDefault();
var files = e.originalEvent.dataTransfer.files;
app.myCurrentNote.addAttachement(files);
});
【问题讨论】:
-
预期结果是什么?
-
我想要
0作为闭包中index值的结果 - 最后我得到了它,但只是使用了这个丑陋的解决方法。如果我没有明确传递参数,那么我会得到1,我不知道为什么。如果我可以将this传递给闭包并从那里访问attachmentIndex,那就容易多了。 -
不确定是否正确解释问题?在
for循环var i = 0, f;内f的目的是什么?i是否定义为f = files[i]?试过for (var i = 0; i < files.length; i++) {? -
它为我节省了检索文件对象的额外麻烦。我在代码中还需要
i我刚刚跳过了这段代码sn-p,因为我认为它不相关。
标签: javascript closures filereader