繁体   English   中英

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

[英]How can I check if cordova is ready if the deviceready event has already fired?

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

根据cordova文档

deviceready事件的行为与其他事件略有不同。 在deviceready事件触发后注册的任何事件处理程序都会立即调用其回调函数。

正如您可以看到在设备已经触发是否附加了任何事件处理程序,它将立即被调用。
setTimeout函数中, 不再指向目标对象,上下文不同。 因此永远不会调用您的处理程序。
您可以通过将以下代码放在<head>标记中来尝试以下代码,其中我使用全局函数/变量(为了简单起见,避免出现上下文问题)。 这应该会显示警报。

<script>
    function onDeviceReady () {
     alert("Calling onDeviceReady()");
    }

    setTimeout(function () {
            document.addEventListener('deviceready', onDeviceReady, false);
    }, 9000);
</script>

frank回答确实有效。 但处理这个的正确方法不是通过添加超时。

将在加载DOM时创建deviceready事件处理程序。 因此,要使用该事件,我们应该等待直到DOMContentLoaded 之后我们可以将侦听器添加到deviceready事件中

document.addEventListener("DOMContentLoaded", function() {
    //alert("Calling DOMContentLoaded");
    document.addEventListener('deviceready', function(){
        //alert("Calling onDeviceReady()");
        callFirebase();
    }, false);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM