Cordova requestFileSystem不再被加载3.4.1



我最近更新到Cordova 3.4.1,然后我继续构建和测试我的项目,发现它有问题。我花了一天半的时间试图恢复和重建项目,使其正常工作。到目前为止,我试过的都没用。

输入错误:

Uncaught TypeError: Object [object DOMWindow] has no method 'requestFileSystem'

用于产生此错误的代码:

var app = {
    appRoot: 'cdvfile://localhost/persistent/',
    init: function(){
        this.bindEvents();
    },
    bindEvents: function(){
        document.addEventListener('deviceready', this.onDeviceReady(this), false);
    },
    onDeviceReady: function(that){
        //location.reload(true);
        console.log(Object.keys(window));
        console.log(Object.keys(cordova));
        window.requestFileSystem(window.PERSISTENT, 0, function(fs){
            console.log('we have a fs');
            fs.root.getFile(dir+file,{create:true, exclusive: false},function(fileEntry){
                console.log('we have a file entry');
                var reader = new FileReader();
                reader.onloadend = function(evt){
                    success(evt.target.result);
                };
                reader.readAsText(dir+file);
            },fail);
        },fail);
    }
};
function fail(e){
    var msg = '';
    switch (e.code) {
      case FileError.QUOTA_EXCEEDED_ERR:
        msg = 'QUOTA_EXCEEDED_ERR';
        break;
      case FileError.NOT_FOUND_ERR:
        msg = 'NOT_FOUND_ERR';
        break;
      case FileError.SECURITY_ERR:
        msg = 'SECURITY_ERR';
        break;
      case FileError.INVALID_MODIFICATION_ERR:
        msg = 'INVALID_MODIFICATION_ERR';
        break;
      case FileError.INVALID_STATE_ERR:
        msg = 'INVALID_STATE_ERR';
        break;
      default:
        msg = 'Unknown Error';
        break;
    };
    console.log('Error: ' + msg);
 }
 app.init();

我试过了:

  • 我尝试使用以下Cordova版本3.3.1,3.4.0,3.4.1,3.5.0
  • 我尝试使用旧版本的文件api 1.0.0, 1.0.1, 1.1.0
  • 我试着从头开始创建一个新项目
  • 我已经尝试使用api版本17,19构建
  • 我已经尝试在android 4.2.2和4.4.2上进行测试

我已经验证了插件被加载到项目中,并且它被构建到设备上。我使用Android SDK自带的monitor.bat来观察控制台事件和错误,requestFileSystem只是没有被注入。

我试过使用(按照这里的建议):

location.reload()

location.reload(true) //not from cache

查看cordova插件初始化是否有错误,但没有。

有没有人有更多的建议可以解决这个问题?

您实际上太早调用deviceReady了。这一行:

document.addEventListener('deviceready', this.onDeviceReady(this), false);

返回结果onDeviceReady被传递给addEventListener,这不是你的意图,并意味着它得到调用之前任何插件初始化。

最好这样做:

document.addEventListener('deviceready', this.onDeviceReady, false);

如果必须传递this(或其他参数),则这样做:

document.addEventListener('deviceready', this.onDeviceReady.bind(this), false);

但是你不应该真的这样做,假设你正确地设置了你的对象

最新更新