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

Sha*_*awn 9 javascript events ready cordova

在cordova提供的示例app中cordova create ...,以下代码监听deviceready事件:

bindEvents: function() {
    document.addEventListener('deviceready', this.onDeviceReady, false);
},
Run Code Online (Sandbox Code Playgroud)

这很好,但是在我有时间听之前事件被解雇会发生什么?例如,使用以下内容替换示例应用程序(上面)中的代码:

bindEvents: function() {
    setTimeout(function () {
        document.addEventListener('deviceready', this.onDeviceReady, false);
    }, 2000)
},
Run Code Online (Sandbox Code Playgroud)

在此示例中,永远不会调用this.onDeviceReady.是否有更好,更可靠的方法来检查cordova是否准备好了?像这样的东西:

bindEvents: function() {
    setTimeout(function () {
        if (window.cordovaIsReady) {
            this.onDeviceReady()
        } else {
            document.addEventListener('deviceready', this.onDeviceReady, false);
        }
    }, 2000)
},
Run Code Online (Sandbox Code Playgroud)

fra*_*ank 21

根据cordova文档

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

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

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

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