web-dev-qa-db-ja.com

devicereadyイベントがすでに発生している場合、Cordovaの準備ができているかどうかを確認するにはどうすればよいですか?

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)
},
9
Shawn

コルドバのドキュメントによる

Devicereadyイベントの動作は、他のイベントとは多少異なります。 devicereadyイベントの発生後に登録されたイベントハンドラーには、コールバック関数がすぐに呼び出されます。

イベントハンドラーがアタッチされているかどうかを確認できるように[〜#〜] after [〜#〜]デバイスレディが起動すると、すぐにと呼ばれます。
setTimeout関数ではthisは目的のオブジェクトを指していないため、コンテキストが異なります。したがって、ハンドラーが呼び出されることはありません。
以下のコードを<head>タグに配置することで試すことができます。ここでは、グローバル関数/変数を使用しています(簡単にするためにthisコンテキストの問題を回避しています)。これにより、アラートが表示されます。

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

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