Вы правы, проблема связана с асин c поведением FileReader
. Вам нужно закрытие:
var charId = 0;
var count = 0;
$("#character").change(function(e) {
var amtchar = Math.max(parseInt($('#amtchar').val(), 10), 1);
for (var a = 0; a < amtchar; a++) {
for (var i = 0; i < this.files.length; i++) {
let fileInput = this;
(function(i) {
var file = fileInput.files[i];
var img = document.createElement("img");
var reader = new FileReader();
reader.onloadend = function() {
img.src = reader.result;
}
reader.readAsDataURL(file);
img.id = 'charImg' + charId;
$("#character").after(img);
charId++;
})(i);
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<label id="lblchar">Number of Character</label>
<input id="amtchar" value="0" />
<label id="lblchar">Add a Character</label>
<input id="character" type="file" />
В качестве альтернативы, если вы можете использовать ES6 в проекте, используйте ключевое слово let
вместо:
var charId = 0;
var count = 0;
$("#character").change(function(e) {
var amtchar = Math.max(parseInt($('#amtchar').val(), 10), 1);
for (var a = 0; a < amtchar; a++) {
for (var i = 0; i < this.files.length; i++) {
let file = this.files[i];
let img = document.createElement("img");
let reader = new FileReader();
reader.onloadend = function() {
img.src = reader.result;
}
reader.readAsDataURL(file);
img.id = 'charImg' + charId;
$("#character").after(img);
charId++;
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<label id="lblchar">Number of Character</label>
<input id="amtchar" value="0" />
<label id="lblchar">Add a Character</label>
<input id="character" type="file" />
Однако ничего не стоит, что внутренний l oop над коллекцией files
является избыточным. Для входного файла не установлен атрибут multiple
, поэтому будет только 1 файл.