Javascript file方法使dataTransferItemList为空
我正在尝试实现上传文件和文件夹的功能。我在chrome中删除了一些文件和文件夹,然后得到了dataTransferItemList类型的条目列表,然后我想对列表中的每个条目执行一些操作。我使用webkitGetAsEntry函数获得一个条目,当我尝试调用FileEntry对象dataTransferItemList的file函数时,该条目变为空Javascript file方法使dataTransferItemList为空,javascript,html,Javascript,Html,我正在尝试实现上传文件和文件夹的功能。我在chrome中删除了一些文件和文件夹,然后得到了dataTransferItemList类型的条目列表,然后我想对列表中的每个条目执行一些操作。我使用webkitGetAsEntry函数获得一个条目,当我尝试调用FileEntry对象dataTransferItemList的file函数时,该条目变为空 _processEntries: function () { //this._entries list of entries of ty
_processEntries: function () {
//this._entries list of entries of type dataTransferItemList
var entry = this._getNetxFileEntry(this._entries);
if (!isNullOrUndefined(entry)) {
if (entry.webkitGetAsEntry) {
entry = entry.webkitGetAsEntry();
} else {
//TODO: code for other browsers without getAsEntry implementation
}
if (entry.isFile) {
this._readAsFileEntry(entry);
}
else if (entry.isDirectory) {
this._readAsDirectoryEntry(entry);
}
}
},
_readAsFileEntry: function (fileEntry) {
fileEntry.file($.proxy(this._onFileSuccessfullyRead, this));
},
_onFileSuccessfullyRead: function (file) {
//Here this._entries becomes empty so i can't read next entry
},
为什么会发生这种情况?在这种情况下,我如何处理所有实体?
谢谢你的帮助。我也为此头疼不已 我就是这样解决的
afterInit : function() {
this.uploads = [];
this.entries = [];
for ( var i = 0; i < this.options.items.length; i++)
this.entries.push(this.options.items[i].webkitGetAsEntry());
this.scan(0);
},
scan : function(i) {
if (i >= 0 && i < this.entries.length) {
var entry = this.entries[i];
if (entry.isDirectory) {
entry.createReader().readEntries(this.readEntries.bind(this, i + 1));
} else if (entry.isFile) {
this.manageFileEntry(entry);
this.scan(i + 1);
}
} else if (this.uploads.length > 0)
this.doUpload(0);
}
afterInit:function(){
this.uploads=[];
this.entries=[];
对于(var i=0;i=0&&i0)
这是双倍体(0);
}
请记住,.file()和.readEntries()是异步的。这意味着您的方法将立即返回,并且允许JS引擎“释放”资源。由于是异步的,有一个时刻(即当您的方法返回时)dataTransferItemList超出范围,因此被释放(设置为null)
正如您在我的代码中看到的,由于对.file()或.readEntries()的异步调用,在我的项超出范围之前,我预防性地保存了调用.webkitGetAsEntry()的项引用
希望这有帮助,我花了2个小时调试这个,然后才想出解决方案 我也为此头疼不已 我就是这样解决的
afterInit : function() {
this.uploads = [];
this.entries = [];
for ( var i = 0; i < this.options.items.length; i++)
this.entries.push(this.options.items[i].webkitGetAsEntry());
this.scan(0);
},
scan : function(i) {
if (i >= 0 && i < this.entries.length) {
var entry = this.entries[i];
if (entry.isDirectory) {
entry.createReader().readEntries(this.readEntries.bind(this, i + 1));
} else if (entry.isFile) {
this.manageFileEntry(entry);
this.scan(i + 1);
}
} else if (this.uploads.length > 0)
this.doUpload(0);
}
afterInit:function(){
this.uploads=[];
this.entries=[];
对于(var i=0;i=0&&i0)
这是双倍体(0);
}
请记住,.file()和.readEntries()是异步的。这意味着您的方法将立即返回,并且允许JS引擎“释放”资源。由于是异步的,有一个时刻(即当您的方法返回时)dataTransferItemList超出范围,因此被释放(设置为null)
正如您在我的代码中看到的,由于对.file()或.readEntries()的异步调用,在我的项超出范围之前,我预防性地保存了调用.webkitGetAsEntry()的项引用
希望这有帮助,我花了2个小时调试这个,然后才想出解决方案