Javascript HTML5文件API:FileReader对象在发生错误后未定义

Javascript HTML5文件API:FileReader对象在发生错误后未定义,javascript,html,filereader,fileapi,Javascript,Html,Filereader,Fileapi,我在MacOSX上使用Chrome12,并且在文档中包含了jQuery1.6.1 我尝试使用以下代码读取文件,读取文件时可能会发生错误,因此调用了this.error.onerror(),但FileReader对象this.reader不再存在,我无法获取错误。我也不知道为什么会发生错误,这是一个我想阅读的常规文本文档 function FileHandler(files, action) { console.log('FileHandler called.'); this.f

我在MacOSX上使用Chrome12,并且在文档中包含了jQuery1.6.1

我尝试使用以下代码读取文件,读取文件时可能会发生错误,因此调用了this.error.onerror(),但FileReader对象this.reader不再存在,我无法获取错误。我也不知道为什么会发生错误,这是一个我想阅读的常规文本文档

function FileHandler(files, action) {
    console.log('FileHandler called.');

    this.files = files;
    this.reader = new FileReader();
    this.action = action;

    this.handle = function() {
        console.log('FileHandler.handle called.');

        for (var i = 0; i < this.files.length; i++) {
            this.reader.readAsDataURL(files[i]);
        }
    }

    this.upload = function() {
        console.log('FileHandler.upload called.');
        console.log(this.reader);

        data = {
            content: this.reader.result
        }

        console.log(data);
    }

    this.error = function() {
        console.log('An error occurred while reading a file.');
        console.log(this.reader.error);
    }

    this.reader.onload = this.upload;
    this.reader.onerror = this.error;
}
函数FileHandler(文件、操作){
log('FileHandler已调用');
this.files=文件;
this.reader=new FileReader();
这个动作=动作;
this.handle=函数(){
log('FileHandler.handle已调用');
对于(var i=0;i
此代码创建以下控制台输出:
内部
.onerror
,此
与外部不同,因为它是一个新函数(具有新范围)

通过如下静态设置来跟踪

var _this = this; // _this won't change
this.reader.onerror = function() {
    console.log('An error occurred while reading a file.');
    console.log(_this.reader.error);
}

这应该是正确的方法:

reader.onerror = function(event) {
    console.error("File could not be read: " + event.target.error);
};

我已经以我认为应该可以使用的方式更新了代码(至少它可以使用这个.upload)。但是错误仍然发生,并且控制台输出是相同的。您确定它是未定义的吗?请注意,
\u此
应在
外部定义。错误
。请问“多个对象”的确切含义是什么?好的,但我必须找到一种方法来选择创建多个对象。我必须在不将其设置为静态的情况下使用该对象。有什么好办法吗?对于多个对象,我指的是使用不同的“实例变量”创建此“类”的n个对象的选项。您可以改为执行
this.reader.onerror=this.error.bind(this)
,然后再次使用
this
(删除
\u this
)。如果您将文件托管在web服务器上,是否存在相同的问题?如果你使用FF而不是Chrome,你有同样的问题吗?如果不是,那么你可能会遇到Chrome的同源策略。请参见此处的答案和评论: