Редактировать: просто используйте let
вместо var
в цикле.Это устраняет проблему, которая возникла у OP (но была введена только в 2015 году).
Старый ответ (интересный обходной путь):
Несмотря на то, что он не совсем надежен или рассчитан на будущее, онСтоит отметить, что это также может быть достигнуто путем добавления свойства к объекту FileReader
:
var reader = new FileReader();
reader._NAME = files[i].name; // create _NAME property that contains filename.
Затем доступ к нему через e
в функции обратного вызова onload
:
li.innerHTML = e.target._NAME + "____" + text;
Почему это работает:
Несмотря на то, что переменная reader
заменяется несколько раз во время цикла, как i
, объект new FileReader
уникален и остается в памяти.Он доступен в функции reader.onload
через аргумент e
.Храня дополнительные данные в объекте reader
, они сохраняются в памяти и доступны через reader.onload
через e.target
аргумент события.
Это объясняет, почему ваш вывод:
file2 __ content1
file2__content2
, а не:
file1__content1
file2__content2
Theсодержимое отображается правильно, поскольку e.target.result
является свойством самого объекта FileReader
.Если бы FileReader
содержал свойство имени файла по умолчанию, его можно было бы использовать, и весь этот беспорядок полностью исключался.
Слово предостережения
Это называется расширение хост-объектов (если я понимаю разницу между нативными объектами ...).FileReader
- это хост-объект, который расширяется в этой ситуации.Многие профессиональные разработчики считают, что это плохая практика и / или зло.Столкновения могут произойти, если _NAME
когда-либо станет использоваться в будущем.Эта функциональность не задокументирована ни в одной спецификации, поэтому она может даже сломаться в будущем и может не работать в старых браузерах.
Лично я не столкнулся с какими-либо проблемами, добавив дополнительныесвойства для размещения объектов.Предполагая, что имя свойства достаточно уникально, браузеры не отключают его, и будущие браузеры не слишком меняют эти объекты, оно должно работать нормально.
Вот несколько статей, которые достаточно хорошо объясняют это:
http://kendsnyder.com/extending-host-objects-evil-extending-native-objects-not-evil-but-risky/
http://perfectionkills.com/whats-wrong-with-extending-the-dom/
И некоторые статьи о самой проблеме:
http://tobyho.com/2011/11/02/callbacks-in-loops/