如果deviceready事件已经被触发,我如何检查cordova是否准备好了?

时间:2014-08-16 16:49:03

标签: javascript events cordova ready

在示例应用中,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)
},

2 个答案:

答案 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);
});