在 Javascript 中上传多张图片时 filereader 结果顺序发生变化
filereader result order changing while uploading multiple images in Javascript
我正在尝试使用 Javascript 上传多张图片并放置在单独的 img 标签中。这是我试过的,
MyJsp.jsp :
<div>
<img alt="Image1" id="Image1" src="" width="130px" height="90px"><br><br>
<img alt="Image2" id="Image2" src="" width="130px" height="90px"><br><br>
<img alt="Image3" id="Image3" src="" width="130px" height="90px"><br><br>
<img alt="Image4" id="Image4" src="" width="130px" height="90px"><br><br>
<img alt="Image5" id="Image5" src="" width="130px" height="90px"><br><br>
</div>
<input type="file" id="files" name="files[]" accept="image/gif,image/jpeg"/ multiple>
<input type="text" id="imginsert" value="1">
MyJS.js :
$(function(){
document.querySelector('#files').addEventListener('change', handleFileSelect, false);
function handleFileSelect(evt) {
var files = evt.target.files; // FileList object
// alert("1");
// Loop through the FileList and render image files as thumbnails.
for (var i = 0, f; f = files[i]; i++) {
// Only process image files.
if (!f.type.match('image.*')) {
continue;
}
var reader = new FileReader();
reader.onload = (function(theFile) {
return function(e) {
var count=$('#imginsert').val();
if(count==1){
$('#Image1').attr("src",e.target.result);
$('#imginsert').val('2');
//alert("first :"+e.target.result);
}
else if(count==2)
{
//alert("else if 1");
$('#Image2').attr("src",e.target.result);
$('#imginsert').val('3');
//alert("2 :"+e.target.result);
}
else if(count==3)
{
//alert("else if 2");
$('#Image3').prop("src",e.target.result);
$('#imginsert').val('4');
//alert("3 :"+e.target.result);
}
else if(count==4)
{
$('#Image4').prop("src",e.target.result);
$('#imginsert').val('5');
//alert("4 :"+e.target.result);
}
else if(count==5)
{
$('#Image5').prop("src",e.target.result);
$('#imginsert').val('6');
//alert("5 :"+e.target.result);
}
else
{
alert("You can upload only 5 images.");
}
};
})(f);
// Read in the image file as a data URL.
reader.readAsDataURL(f);
}
}
});
如果我正在上传 Img1.jpg,Img2.jpg,Img3.jpg,Img4.jpg,Img5.jpg 意味着 OP 是:
Img2.jpg
Img4.jpg
Img1.jpg
Img3.jpg
Img5.jpg
我预期的 OP 是:
Img1.jpg
Img2.jpg
Img3.jpg
Img4.jpg
Img5.jpg
我哪里做错了是不是像上传图片那样按顺序排列?
readAsDataURL
是异步的,因此您不能保证它们会按任何顺序完成。只需将文件的索引与您的文件一起传递给您的 IIFE
reader.onload = (function(theFile, count) {
return function(e) {
if (count > 5)
{
alert("You can upload only 5 images.");
}
else{
$('#Image'+count).prop("src",e.target.result);
}
};
})(f,i+1);
我正在尝试使用 Javascript 上传多张图片并放置在单独的 img 标签中。这是我试过的,
MyJsp.jsp :
<div>
<img alt="Image1" id="Image1" src="" width="130px" height="90px"><br><br>
<img alt="Image2" id="Image2" src="" width="130px" height="90px"><br><br>
<img alt="Image3" id="Image3" src="" width="130px" height="90px"><br><br>
<img alt="Image4" id="Image4" src="" width="130px" height="90px"><br><br>
<img alt="Image5" id="Image5" src="" width="130px" height="90px"><br><br>
</div>
<input type="file" id="files" name="files[]" accept="image/gif,image/jpeg"/ multiple>
<input type="text" id="imginsert" value="1">
MyJS.js :
$(function(){
document.querySelector('#files').addEventListener('change', handleFileSelect, false);
function handleFileSelect(evt) {
var files = evt.target.files; // FileList object
// alert("1");
// Loop through the FileList and render image files as thumbnails.
for (var i = 0, f; f = files[i]; i++) {
// Only process image files.
if (!f.type.match('image.*')) {
continue;
}
var reader = new FileReader();
reader.onload = (function(theFile) {
return function(e) {
var count=$('#imginsert').val();
if(count==1){
$('#Image1').attr("src",e.target.result);
$('#imginsert').val('2');
//alert("first :"+e.target.result);
}
else if(count==2)
{
//alert("else if 1");
$('#Image2').attr("src",e.target.result);
$('#imginsert').val('3');
//alert("2 :"+e.target.result);
}
else if(count==3)
{
//alert("else if 2");
$('#Image3').prop("src",e.target.result);
$('#imginsert').val('4');
//alert("3 :"+e.target.result);
}
else if(count==4)
{
$('#Image4').prop("src",e.target.result);
$('#imginsert').val('5');
//alert("4 :"+e.target.result);
}
else if(count==5)
{
$('#Image5').prop("src",e.target.result);
$('#imginsert').val('6');
//alert("5 :"+e.target.result);
}
else
{
alert("You can upload only 5 images.");
}
};
})(f);
// Read in the image file as a data URL.
reader.readAsDataURL(f);
}
}
});
如果我正在上传 Img1.jpg,Img2.jpg,Img3.jpg,Img4.jpg,Img5.jpg 意味着 OP 是:
Img2.jpg
Img4.jpg
Img1.jpg
Img3.jpg
Img5.jpg
我预期的 OP 是:
Img1.jpg
Img2.jpg
Img3.jpg
Img4.jpg
Img5.jpg
我哪里做错了是不是像上传图片那样按顺序排列?
readAsDataURL
是异步的,因此您不能保证它们会按任何顺序完成。只需将文件的索引与您的文件一起传递给您的 IIFE
reader.onload = (function(theFile, count) {
return function(e) {
if (count > 5)
{
alert("You can upload only 5 images.");
}
else{
$('#Image'+count).prop("src",e.target.result);
}
};
})(f,i+1);