2
for (var i=0, file; file=files[i]; i++) {
    if (file.type=='image/jpeg') {
        var reader = new FileReader();
        reader.onload = function(e) {
            $('#upload_preview').append('<img src="'+e.target.result+'" width="150" alt="" />');
            alert(file.type); // error - file is undefined
        }
        reader.readAsDataURL(file);
    }
}

ファイルが定義されたコード ブロック内で変数リーダーが宣言されましたが、エラー レポート変数ファイルは未定義です。これは私を夢中にさせています、そしてそれが本当に基本的なことであることを私は知っています.

4

1 に答える 1

3

したがってfor (var i=0, file; file=files[i]; i++)、コメント内のこのループの言及はundefined、最後のループで file を設定します。スコープを節約するには、for ループで関数を使用eachまたは呼び出す必要があります。

files.forEach(function(file){
if (file.type=='image/jpeg') {
    var reader = new FileReader();
    reader.onload = function(e) {
        $('#upload_preview').append('<img src="'+e.target.result+'" width="150" alt="" />');
        alert(file.type); // error - file is undefined
    }
    reader.readAsDataURL(file);
}
})

または、古いブラウザをサポートする必要がある場合:

for (var i=0, l=files.length; i < l; i++) {
    (function(i) {
        var file = files[i];
        if (file.type == 'image/jpeg') {
            var reader = new FileReader();
            reader.onload = function(e) {
                $('#upload_preview').append('<img src="' + e.target.result + '" width="150" alt="" />');
                alert(file.type); // error - file is undefined
            }
            reader.readAsDataURL(file);
        }
    })(i);
}
于 2012-09-02T09:17:24.697 に答える