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

问题描述 投票:0回答:2

在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)
},
javascript events cordova ready
2个回答
28
投票

根据科尔多瓦文档

deviceready

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

如您所见,如果附加了任何事件处理程序,在 deviceready 触发后,它将被调用立即
setTimeout 函数中,this 不再指向预期对象,上下文不同。因此你的处理程序永远不会被调用。 您可以通过将以下代码放置在
<head>

 标签中来尝试以下代码,我在其中使用全局函数/变量(为了简单起见,避免 
this 上下文问题)。这应该会向您显示警报。

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

-1
投票

frank

答案确实有效。但处理这个问题的正确方法不是添加超时。 

deviceready

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

document.addEventListener("DOMContentLoaded", function() { //alert("Calling DOMContentLoaded"); document.addEventListener('deviceready', function(){ //alert("Calling onDeviceReady()"); callFirebase(); }, false); });
    
© www.soinside.com 2019 - 2024. All rights reserved.