在示例应用中,cordova通过cordova create ...
提供,以下代码侦听deviceready
事件:
bindEvents: function() {
document.addEventListener('deviceready', this.onDeviceReady, false);
},
这很好,但是在我有时间听之前事件发生时会发生什么?例如,使用以下内容替换示例应用程序(上面)中的代码:
bindEvents: function() {
setTimeout(function () {
document.addEventListener('deviceready', this.onDeviceReady, false);
}, 2000)
},
在此示例中,永远不会调用this.onDeviceReady。是否有更好,更可靠的方法来检查cordova是否准备好了?像这样:
bindEvents: function() {
setTimeout(function () {
if (window.cordovaIsReady) {
this.onDeviceReady()
} else {
document.addEventListener('deviceready', this.onDeviceReady, false);
}
}, 2000)
},
答案 0 :(得分:19)
根据cordova文档
deviceready事件的行为与其他事件略有不同。任何 在deviceready事件触发后注册的事件处理程序 立即调用回调函数。
正如您所看到的,如果任何事件处理程序已连接 AFTER ,设备已经解雇,它将立即被称为 。
在 setTimeout 函数中,不再指向目标对象,上下文不同。因此,永远不会调用您的处理程序
您可以将以下代码放在<head>
标记中,我在其中使用全局函数/变量(为简单起见,请避免出现此上下文问题)。这应该会显示警告。
<script>
function onDeviceReady () {
alert("Calling onDeviceReady()");
}
setTimeout(function () {
document.addEventListener('deviceready', onDeviceReady, false);
}, 9000);
</script>
答案 1 :(得分:-1)
frank
答案确实有效。但处理这个的正确方法不是通过添加超时。
在加载DOM时将创建deviceready
事件处理程序。因此,要使用该事件,我们应该等到DOMContentLoaded
。之后我们可以将监听器添加到deviceready
事件
document.addEventListener("DOMContentLoaded", function() {
//alert("Calling DOMContentLoaded");
document.addEventListener('deviceready', function(){
//alert("Calling onDeviceReady()");
callFirebase();
}, false);
});