【发布时间】:2019-03-13 12:03:04
【问题描述】:
我正在尝试生成一些可以在整个网站中重复使用的代码,它本质上是一个带有一些验证的照片选择器/选择器。这是我的代码:
class PhotoPicker
{
constructor(element)
{
this.element = element;
//Creating needed HTML Markup
this.createMarkUp();
//FileList of valid data.
this.validFiles = new DataTransfer();
//Initialise Picker.
this.input.onchange = () => {
this.updateOutput();
this.output.files = this.validFiles.files;
}
}
updateOutput()
{
const files = Array.from(this.input.files);
files.forEach((file) => {
let reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => {
photo = this.createPhotoThumb({
url : reader.result,
name: file.name,
size: file.size
});
if (this.validatePhoto(file)) {
this.validFiles.items.add(file);
};
};
});
}
createMarkUp()
{
//Creating needed HTML Markup
}
createPhotoThumb(data = {})
{
//Creating a photo thumbnail for preview
}
validatePhoto(photo)
{
//Validating the photo
}
}
发生的情况是,当我第一次选择一些图像时,会显示缩略图并更新有效文件列表this.validFiles.files,但不是最终列表我计划将其发送到服务器 this.output.files,然而,在第二次尝试时,它可以工作!最终列表将使用第一个选择中的文件进行更新,NOT 第二个,依此类推.. 每次选择时,前一个选择中的文件都会添加到最终列表中列出但不列出上次选择的文件。
【问题讨论】:
-
Class应该是小的c我认为 -
这是
constructor而不是constrctor -
是的,两者都是真的,抱歉打错了.. 有什么关于逻辑的吗?问题本身?
-
FileReader#onload 是异步的。添加一些日志记录,您会发现
this.createPhotoThumb仅在您的forEach循环完成后才被调用(方式) -
为什么要创建文件的 dataURI 版本?如果您只想显示它,请使用 blob URI,您可以使用
URL.createObjectURL(blob)同步创建它。
标签: javascript html input filelist