我正在构建一个PhoneGap应用程序。不幸的是,在部署到iOS设备和模拟器时,deviceready
事件永远不会触发。我正在使用Phonegap 2.2.0。
当我将相同的代码部署到Android时(当然使用特定于Android的cordova.js
文件),该应用程序将完美运行。
当我用jQuery替换deviceready
- ready()
时,应用程序也会在iOS上加载,但它将无法访问特定于设备的API。
cordova.js
已加载,因为我会看到一条简单的警告消息,但是deviceready
永远不会触发,API永远不会暴露。
我的HTML head
:
<script type="text/javascript" charset="utf-8" src="js/cordova.js"></script> <!-- yes it is the iOS version -->
<script src="js/jquery-1.8.2.min.js"></script>
<script src="js/app.js"></script>
我的JS:
function doStuff(){
//app functionality
}
document.addEventListener('deviceready', doStuff, false);
但不知何故,东西只能在Android上完成......
答案 0 :(得分:10)
在我的html中,我有一个onload,触发向deviceready添加事件监听器
function onDeviceReady() {
console.log("we are an app");
MyApp.initialize_phonegap();
}
function onBodyLoad() {
document.addEventListener("deviceready", onDeviceReady, false);
}
</script>
</head>
<body onload="onBodyLoad()">
答案 1 :(得分:4)
为了添加到olore的答案,我最终使用了默认项目中的代码(从./create
脚本构建)使用的方法(与 {{3中的代码不同) }} 强>)。
主要区别是(我真的不知道其中哪一个实际上要考虑在内):
cordova-2.2.0.js
位于根文件夹<script>
包含在收尾</body>
- 标记之前,而不在文档的head
deviceready
- 处理方式如下:
var app = {
// Application Constructor
initialize: function() {
this.bindEvents();
},
// Bind Event Listeners
//
// Bind any events that are required on startup. Common events are:
// 'load', 'deviceready', 'offline', and 'online'.
bindEvents: function() {
document.addEventListener('deviceready', this.onDeviceReady, false);
},
// deviceready Event Handler
//
// The scope of 'this' is the event. In order to call the 'receivedEvent'
// function, we must explicity call 'app.receivedEvent(...);'
onDeviceReady: function() {
app.receivedEvent('deviceready');
myApp.start(); //this is where I put the call to my App's functionality relying on device APIs
},
// Update DOM on a Received Event
receivedEvent: function(id) { // I didn't really use this, yet I left it in here as it's in the demo
var parentElement = document.getElementById(id);
var listeningElement = parentElement.querySelector('.listening');
var receivedElement = parentElement.querySelector('.received');
listeningElement.setAttribute('style', 'display:none;');
receivedElement.setAttribute('style', 'display:block;');
console.log('Received Event: ' + id);
}
};
最后一个<script>
代码只是调用app.initialize()
这似乎在iOS和Android上运行得相当好,对我来说比从文档中嵌套的双重处理程序更容易理解。
答案 2 :(得分:1)
如果您在 cordova.js 之前添加 deviceready 侦听器或 ,这似乎会有所不同>:
我无法找到任何关于此的文档,但是cordova.js拦截了对addEventListener + removeEventListener的调用,并且只调用了在之前添加了的cordready回调。 cordova.js。
我的案例中的解决方案只是重新排列脚本顺序:
<script>
document.addEventListener('deviceready', ...)
</script>
<script src="cordova.js"></script>
答案 3 :(得分:0)
我发现如果你不小心包含了两次cordova.js脚本,那么就不会触发deviceready事件。
答案 4 :(得分:0)
我遇到了同样的问题。我通过添加设备插件让它工作。
$ cordova plugin add org.apache.cordova.device
验证:
$ cordova plugin ls