在for循环内的函数中选择使用for循环创建的特定div

时间:2019-04-06 23:08:14

标签: jquery

我正在尝试使用多个图像上传输入字段显示所选文件的缩略图。这是它应该如何工作的-

  1. 用户选择多张图片(例如5张图片)

  2. 对于每个文件,代码都应创建一个div(作为缩略图)

  3. 由于图片文件大小很大,浏览器可能需要一些时间才能转换为blob。因此,我正在显示为缩略图div中的每个文件加载gif。缩略图div类名称是图片名称(以便以后识别)

  4. 图片开始使用create_blob(file, callback)函数转换为blob

  5. 每张图片一旦转换为blob,都应使用blob代码替换特定的加载gif

我的问题现在: 它创建的div数量与所选图片的数量相同。正确显示loading.gif。但是,每次转换图片后,只有最后一个div保持更新。我想为特定图像更新特定div。我知道变量在循环过程中会被更新,因为它在获得结果之前是异步的。我想保持异步状态,但也想实现步骤5

到目前为止,这是我的代码-

<input type="file" multiple id="add-file" accept="image/*">
<div id="output">
</div>
<script>
(function ($) {
$('#add-file').change(function() {
var files = this.files;
for (var i = 0, file; file = files[i]; i++) {
selected_div = file.name.replace(/[^a-z0-9\s]/gi, "").replace(/[_\s]/g, "-");
$( "#output" ).append( '<div class="section '+selected_div+'"><input type="hidden" class="blob-holder" name="gallery[]" /><img src="loading.gif" 
class="thumb" /></div>' );
create_blob(file, function(blob_string) {
$( "."+selected_div ).find( "img" ).attr('src', blob_string);
$( "."+selected_div ).find( "input" ).val(blob_string);
});
}
});
function create_blob(file, callback) {
var reader = new FileReader();
reader.onload = function() { callback(reader.result) };
reader.readAsDataURL(file);
}
})(jQuery);
</script>

在这里拨弄-https://jsfiddle.net/b0xed/mfq54h9r/1/

如何实现第5步,并且仍然保持异步状态?

提前谢谢

1 个答案:

答案 0 :(得分:0)

这是因为您正在使用父函数中的format,该函数会立即更新并以最后一个div结尾,因此您也应该将其作为参数传递。

selected_div

,您需要按以下方式调用它;

function create_blob(file, divSelector, callback) {
   var reader = new FileReader();
   reader.onload = function() { callback(reader.result, divSelector) };
   reader.readAsDataURL(file);
}

希望这会有所帮助。