我最近更新到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);
但是你不应该真的这样做,假设你正确地设置了你的对象