javascript - 检测到循环计数器变量值错误

标签 javascript jquery

我的测试代码:

var imageUploadPreview = function (e) {
  var input = document.getElementById("file"),
      files = e.target.files;

    for (var i = 0; i < files.length; i++) {
        if (input.files) {
            var file = files[i],
                reader = new FileReader();

            reader.onload = function (e) {
                (function (i) {
                    var img = $('<img>').prop('id', 'img_' + i)
                     .prop('src', e.target.result).css({'width':'60px', 'height':'60px'});

                    var div = $('<div>').append(img).append(img.prop('id'))
                    $('body').append(div);
                })(i)
            }
            reader.readAsDataURL(file);
        }
    }
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<input type="file" id="file" onchange="imageUploadPreview(event)" multiple />

它正在工作,除了:所有图像 ID 都是 img_ + files.length

你能解释一下为什么吗?循环发生了什么?

最佳答案

你几乎已经用 iife 执行 i 了,你需要将它移到 onload 之外。问题是 onload 是异步调用的,所以当它运行时,循环就完成了。这就是为什么 i 是每个文件的最后一个索引。您需要在 onload 运行之前执行 iife。

        reader.onload = function (e) {
            (function (i) {
                var img = $('<img>').prop('id', 'img_' + i)
                 .prop('src', e.target.result).css({'width':'60px', 'height':'60px'});

                var div = $('<div>').append(img).append(img.prop('id'))
                $('body').append(div);
            })(i)
        }

(function (i) {
    reader.onload = function (e) {
        var img = $('<img>').prop('id', 'img_' + i)
            .prop('src', e.target.result).css({
                'width': '60px',
                'height': '60px'
            });

        var div = $('<div>').append(img).append(img.prop('id'))
        $('body').append(div);
    }
})(i);

关于javascript - 检测到循环计数器变量值错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34203412/

相关文章:

javascript - 如何返回 html 页面而不重新加载它

javascript - 重定向到另一个页面在 ajax 调用中不起作用

javascript - 存储 jquery 选择器数组?

javascript - Webpack-hot-middleware 与 Koa 2.0

javascript - 在 Jquery/Javascript 中访问动态属性名称

javascript - 通过滑出一个新元素来替换一个元素

javascript - Web 组件( Vanilla ,无聚合物): how to load <template> content?

javascript - 取消之前的异步 .load() 请求

javascript - 在按键模式下将输入值从 table1 更改为 table2

javascript - 当调用 jQuery 的 .trigger() 函数时,传播到绑定(bind)到该元素的其他处理程序将停止