HTML5 FileList и jQuery каждый

Я хватаю список файлов ([http://www.w3.org/TR/FileAPI/#dfn-filelist]), а затем я хочу использовать каждую функцию JQuery.

var file_list = $(this).attr('files');
/* Code goes here */
file_list.each(function()
{
/* Code goes here */

Я получаю следующую ошибку:

Uncaught TypeError: Object #<FileList> has no method 'each'

есть идеи? Спасибо.

3 ответов


потому что $(this).attr('files'); просто возвращает простой список файлов DOM, а не объект jQuery.

либо вам нужно зациклиться на нем старомодным способом:

for(var i=0,file;file=file_list[i];i++) {
 //do your thing
}

или вы можете использовать $.каждый:

$.each(file_list,function(idx,elm){
     //do your thing
});

имейте в виду, что $.каждый из них медленнее, чем обычный цикл for, и в этом случае дает вам очень мало удобства, поэтому я бы придерживался цикла for.


var file_list = $(this).attr('files');
$.each(file_list,function(i,item){
  // i is the index (integer) of current item
  // item is the current item
  // $(this) is the jQuery selector for the current item
});

в мае 2011 года был выпущен jQuery 1.6, который изменил поведение .attr(), вы должны использовать .prop() вместо этого для доступа к files свойства входного файла.
вот несколько дополнительных способов работы с объектом FileList.

//Get the files property (FileList object) of a file input element from a jQuery instance.
var arraylike=$file_input.prop('files');
//Create an array from an arraylike object using the old hacky way
file_array=Array.prototype.splice.call(arraylike,0,0);
//Or the new way.
file_array=Array.from(arraylike);
//Or just work on it directly.
Array.prototype.forEach.call(arraylike,x=>{console.log(x);});
//Or if you really must use jQuery...
jQuery.each(arraylike,(k,v)=>{console.log(v);});

в случае, если кто-то хочет делать свои собственные исследования: