webkitGetAsEntry的Javascript拖放文件上载问题

webkitGetAsEntry的Javascript拖放文件上载问题,javascript,html,file-upload,Javascript,Html,File Upload,上面的提琴是我代码的精简版本,只是为了突出问题(尝试将文件拖放到窗口中)。基本上,webkitGetAsEntry()。任何帮助都将不胜感激,谢谢 upload.js function Upload() { _this = this; this.fileList = 'no file'; this.fire = function(droppedFiles) { for(i = 0; i< droppedFiles.length; i++) { this.build

上面的提琴是我代码的精简版本,只是为了突出问题(尝试将文件拖放到窗口中)。基本上,
webkitGetAsEntry()。任何帮助都将不胜感激,谢谢

upload.js

function Upload() {
_this = this;
this.fileList = 'no file';

this.fire = function(droppedFiles) {
    for(i = 0; i< droppedFiles.length; i++) {
        this.buildFileSource(droppedFiles[i].webkitGetAsEntry());
    }
    //This returns the original string
    console.log(this.fileList);
}

this.buildFileSource = function(item, path) {
    if(item.isFile) {
        item.file(function(file) {
            _this.fileList = 'file';
            //This works as expected
            console.log(_this.fileList);
        } );
    }
};
}

//Event listeners for dragging  
$(document).ready(function() {
    window.addEventListener("dragenter", function(e) {
            event.stopPropagation();
            event.preventDefault();
            return false;
        }, false);
        window.addEventListener("dragover", function(e) {
            event.stopPropagation();
            event.preventDefault();
            return false;
        }, false);
        window.addEventListener("dragleave", function(e) {
            event.stopPropagation();
            event.preventDefault();
            return false;
        }, false);

    window.addEventListener("drop", function(e) {
        e.stopPropagation();
        e.preventDefault();

        upload = new Upload;
        upload.fire(e.dataTransfer.items);
        return false;
    }, false);
});
函数上传(){
_这个=这个;
this.fileList='无文件';
this.fire=函数(droppedFiles){
对于(i=0;i
console.log(\u this.fileList)buildFileSource
方法中修改
fileList
之前,正在调用
fire
函数中的code>。这是因为
文件条目
(您的
变量)上的
文件
函数是异步函数。实际上,对
buildFileSource
的每次调用也是异步的。查找有关
Entry
界面及其两个子项的更多详细信息:
FileEntry
和MDN上的
DirectoryEntry


请注意,使用
webkitGetAsEntry
方法意味着您的代码只能在Chrome 21+上工作,因为该方法非常特定于Chrome(由于前缀),并且底层概念(
Entry
对象)属于文件系统API,目前只有Chrome 21+支持该API

谢谢你的帮助!考虑到异步性,我最终只使用
window.setTimeout
轮询一个函数,该函数在填充文件数组后将返回true,然后继续执行。这不是一个理想的解决方案,但它现在起作用了。另外,似乎是说它应该同步返回,但可能我没有读对。我没有意识到这个错误,但它似乎是指webkitGetAsEntry。我所指的函数是item/entry对象上的file函数,它完全是一个异步调用。是的,你的解决方案并不理想。我鼓励您接受文件系统API的异步特性,并相应地重构代码。fwiw说,chrome在版本13+@Shanimal中完全支持该文件API是的,该文件API大约在这段时间得到了支持。我说的是文件系统API,它在很久以后才得到支持。实际上,FileSystemAPI是在完全支持的同时引入的。您特别提到的功能是在版本21+中添加的。。。干杯