0

Javascript でライブラリを定義しました。これは、ブラウザを使用しているときにはうまく機能しますが、デバイスの PhoneGap で実行すると名前が見つかりません。

ライブラリは次のように定義されています。

(function(bsdi, $) {
    bsdi.SomeName = "XYZ";
    bsdi.addDays = function (date, days) { ...stuff here...}
    ....
}(bsdi = window.bsdi || {}, jQuery));

後で、最後にロードされた .js ファイルには、次のものがあります。

function knockoutFn() {
    var self = this;
    if (bsdi.SomeName == "XYZ") {  <<--- CRASHES HERE, "bsdi not defined" but only on Device
       ...stuff here... 
    }
}

// Happens to use Knockout...
var koFn = new knockoutFn();
ko.applyBindings(koFn);

function init() {
    if (isPhoneGap) {
        document.addEventListener("deviceready", onDeviceReady, false);
    }
    else {
        koFn.InitPage();
    }
}

function onDeviceReady() {
    // Now safe to use the Cordova API
    koFn.InitPage();
}

何が起こるかというと、通常の Web ブラウザーはこれを問題なく処理します。しかし、PhoneGap Build アプリを使用して iPhone にダウンロードすると、「bsdi.SomeName」になり、bsdi が定義されていないためにクラッシュします。bsdi ライブラリを定義する私の方法は正しいと思いましたが、明らかに、PhoneGap にはこれが気に入らないものがあります。「isPhoneGap」が true であり、デバイスで addEventListener を使用していることに注意してください。

どんなアイデアでも大歓迎です!

更新: 直感で、bsdi オブジェクトを、それを使用するコードと同じ .js ファイルに移動しようとしました。この場合、オブジェクトを見つけて正しく使用します。ただし、外部ファイルの場合は失敗します。はい、ファイルが存在し、正しい場所にあることをトリプルチェックしました。繰り返しますが、ブラウザでは問題なく動作します。

4

1 に答える 1

0

が定義されていない場合、(質問に投稿されているように) 初期化コードは、コードが終了するまでにそれ定義されているwindow.bsdiことを保証しません。渡された新しい空のオブジェクトにこれらのプロパティを追加するだけですが、初期化関数が終了すると何にも影響しません。window.bsdi

于 2015-06-22T19:44:44.707 に答える