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)
},
コルドバのドキュメントによる
Devicereadyイベントの動作は、他のイベントとは多少異なります。 devicereadyイベントの発生後に登録されたイベントハンドラーには、コールバック関数がすぐに呼び出されます。
イベントハンドラーがアタッチされているかどうかを確認できるように[〜#〜] after [〜#〜]デバイスレディが起動すると、すぐにと呼ばれます。
setTimeout関数ではthisは目的のオブジェクトを指していないため、コンテキストが異なります。したがって、ハンドラーが呼び出されることはありません。
以下のコードを<head>
タグに配置することで試すことができます。ここでは、グローバル関数/変数を使用しています(簡単にするためにthisコンテキストの問題を回避しています)。これにより、アラートが表示されます。
<script>
function onDeviceReady () {
alert("Calling onDeviceReady()");
}
setTimeout(function () {
document.addEventListener('deviceready', onDeviceReady, false);
}, 9000);
</script>