2014-01-30 3 views
0

У меня есть следующая проблема.получить результат от FileReader()

У меня есть форма для загрузки для нескольких файлов. Процесс загрузки идет хорошо. Проблема связана с результатом FileReader(). Когда я загружаю несколько файлов (изображений), мне нужно создать соответствующие превью, когда загрузка будет закончена.

files = e.target.files; 

for (var i = 0; i < files.length; i++) { 

    //ajax request goes here 

    var reader = new FileReader(); 
    reader.onload = (function (e) { 

     var img = document.createElement('img'); 
     img.file = e; 
     img.className = 'thumbs_'; 
     img.src = e.target.result; 

     //Every image has a wrapper div with the id 'nDv0','nDv1','nDv2' etc.     

     document.getElementById('nDv' + i).appendChild(img); 
    })(e); 

    reader.readAsDataURL(files[i]); 

    //request sent 

} 

Если я удаляю замыкания вокруг анонимной функции, значение i будет любым, когда цикл for будет завершен. Например, если есть 3 файла, значение i будет равно 3, и результаты будут добавлены к последней обертке div и будут отображаться изображения.

С закрытием каждое изображение добавляется к соответствующему div, но изображения не отображаются, так как возвращаемый результат не определен.

Итак, как я могу добавить каждый палец к соответствующему div?

ответ

0

Вы имеете logic error:

reader.onload = (function (e) { 
    //onload code 
    //inside function e is event from outside 
})(e);//e is event from upper code 

И i будет равен files.length потому onload обработчика асинхронный. Таким образом, вы должны изменить свой onload обработчик:

reader.onload = function (index) { 
    var img = document.createElement('img'); 
    img.className = 'thumbs_';//it's right className? 
    img.src = this.result;//result is dataURL     
    document.getElementById('nDv' + index).appendChild(img); 
}.bind(reader, i); 
+0

Спасибо за очистку это. Я попытался удалить закрытие, но при этом я получаю последнее значение, когда цикл for завершает работу. Btw, я уже удалил строку img.file – user1190478

+0

Да, я буду равен файлу.length, потому что обработчик onload является асинхронным. Попробуйте снова обработчик загрузки из моего ответа на редактирование. – Pinal

+0

Он работает, но img.src теперь имеет значение null. Изображение не отображается. – user1190478

Смежные вопросы