Cordova アプリの開発中にブラウザでも DeviceReady を発火させる方法

Cordova アプリを開発中、Browser プラットフォームを使わずに簡易サーバを立ち上げるなど、何らかの理由で cordova.js を読み込まなかったとする。すると当然、deviceready イベントに登録したコールバック関数は実行されない。deviceready イベントは Cordova が用意する独自のイベントだからだ。

cordova emulate browser を使った場合は、ブラウザでも deviceready が発火する。ということは、何らかの方法で deviceready イベントはブラウザ向けにエミュレートできるということだ。

そこで調べてみると、document.createEvent() などを用いて、カスタムイベントを定義・発火させることで、deviceready を自分で発火させることができた。

まずは発火させたい deviceready イベントを適当に用意する。

document.addEventListener('deviceready', () => {
  console.log('Test');
});

次に、環境変数などで、開発中のみ以下のコードが実行されるようにする。

// 環境変数で開発中のみ以下のコードを実行する
if(environment.development) {
  // deviceready は DOMContentLoaded 以降・onload 以前に発火するので
  // DOMContentLoaded 内で遅延実行する
  document.addEventListener('DOMContentLoaded', () => {
    setTimeout(() => {
      // イベントを作る
      const e = document.createEvent('Event');
      // deviceready イベントを初期化する
      e.initEvent('deviceready', true, false);
      // イベントを発火させる
      document.dispatchEvent(e);
    }, 50);
  });
}

DOMContentLoaded 内で DeviceReady イベントを遅延発火させるので、本来の DeviceReady イベントに近い動作が再現できる。