在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。难道没有更好、更可靠的方法来检查科尔多瓦是否准备就绪吗?像这样的东西:
bindEvents: function() {
setTimeout(function () {
if (window.cordovaIsReady) {
this.onDeviceReady()
} else {
document.addEventListener('deviceready', this.onDeviceReady, false);
}
}, 2000)
},
deviceready
:
事件的行为与其他事件有些不同。 任何deviceready
事件触发后注册的事件处理程序有其 立即调用回调函数。deviceready
如您所见,如果附加了任何事件处理程序,在 deviceready 触发后,它将被调用立即。
在
setTimeout 函数中,this 不再指向预期对象,上下文不同。因此你的处理程序永远不会被调用。
您可以通过将以下代码放置在 <head>
标签中来尝试以下代码,我在其中使用全局函数/变量(为了简单起见,避免this 上下文问题)。这应该会向您显示警报。
<script>
function onDeviceReady () {
alert("Calling onDeviceReady()");
}
setTimeout(function () {
document.addEventListener('deviceready', onDeviceReady, false);
}, 9000);
</script>
frank
答案确实有效。但处理这个问题的正确方法不是添加超时。
deviceready
事件处理程序将在 DOM 加载时创建。因此,要使用该事件,我们应该等到
DOMContentLoaded
。之后我们可以添加监听器到
deviceready
事件
document.addEventListener("DOMContentLoaded", function() {
//alert("Calling DOMContentLoaded");
document.addEventListener('deviceready', function(){
//alert("Calling onDeviceReady()");
callFirebase();
}, false);
});