循环通过 FileReader onload Jquery

Looping Through FileReader onload Jquery

我需要遍历所有类型文件的输入,并将其加载为预览。到目前为止我的代码:

var _i = 0;
function setImagesToPreview(){
  $("form#form-generate-mail input[type=file]").each(function(i){
    var input = $(this);
    _i = i;

    if (input.context['files'] && input.context['files'][0]) {
      var reader = new FileReader();

      reader.onload = function (e) {
        $(document).find("div.modal-preview-mail img.image_placeholder:nth-child("+_i+")").attr('src', e.target.result);
      }

      reader.readAsDataURL(input.context['files'][0]);
    }
  });
}

以下代码有效,但仅适用于 1 个输入。这样做的原因是,作为计数器的变量 'i',当它到达 reader.onload 时,变量被设置为最终值。

ex: 5个输入,计数器'i'每次加1,从0到4,但是一旦到达reader.onload,它总是显示4,从不递增。

任何帮助都会有用,在此先感谢。

只需将内部代码用IIFE包裹起来。因此,您正在创建一个新的执行上下文,并且 i 的当前状态保存在其中。

简要示例:

for (var i = 0; i < 5; i++) {
    (function(i) {
        setTimeout(function() { console.log(i); }, 50 * i);
    })(i);
}

我认为你需要像这样创建一个上下文....

  reader.onload = (function(index){
        return function (e) {
             $(document).find("div.modal-preview-mailimg.image_placeholder:nth-child("+index+")").attr('src', e.target.result);
      };
})(_i);