我正在使用window.FileReader提供用户选择上传的图像的即时预览。
我创建了this jsFiddle
我有以下问题:
A)第63-77行的代码似乎被忽略了,虽然当我在第25行打印“i”的值时,我可以看到它正在增加(我怀疑它必须与窗口的性质有关) .Filereader但不确定。)
if (i == 0) //if this is the first picture add it as primary too
{
var primaryimage = ' <img id=' + filename + ' height="220" width="220" src=' + this.result + ' /> ';
$('#primary-pic').find('.custom-input-file').hide();
$('#primary-pic').find('p').hide();
$('#primary-pic').append(primaryimage);
$('.custom-input-file').show();
}
B)如果您添加多个图像并因某些原因按“设为默认值”,这似乎不适用于最后一张图像,但不知道原因。
由于
答案 0 :(得分:1)
您的代码存在许多问题。
其中:
i
以某种方式“冻结”。事实上,处理程序中的i
读取与主函数中的i
相同:在此示例中,i
进展,函数遇到的值为4
。
for (var i = 0; i < 4; i++) {
var file = input.files[i];
var reader = new FileReader();
reader.onloadend = (function (file) {
return function () {
if (i == 0) { //actually, i will be 4
}
}
})(file)
}
我花了一些时间来解决一些问题。您可以找到我的版本 here 。 我希望你发现它有用并从中学习。
答案 1 :(得分:0)
1)这些行永远不会到达,因为if(i == 0)
然后input.files.length == 1
返回true,所以无论何时进入else部分(上面2行)i
实际上都大于0。 / p>
2)我认为问题是你要创建多个共享相同ID的元素(img和button)。 Id必须是唯一的。
答案 2 :(得分:0)
嘿,我相信我看到了你的问题。您正在循环中使用FileReader对象中的onloadend事件。这是一个异步函数,即JavaScript在进入循环的下一次迭代之前不会等待此函数执行。因此,你的一些逻辑依赖于已经为所讨论的图像执行的onloadend函数,但是在你当前的设置中这是不可靠的,i var可能指向循环的下一次迭代但是onloadend函数可能仍然是执行前一个循环并使用错误的i值。这也会破坏你的其余逻辑。关于问题b)我没有完全深入研究这个问题但是我注意到你在循环内部声明了click事件,因此一些图像附加了这个事件的多个实例。我的建议是,等待所有图像加载,然后注入任何额外的HTML,然后设置您需要的任何事件(即点击事件)。我敢打赌问题b)如果你这样做会自行解决:)