我已经在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();
}
正常的网络浏览器处理这个问题就好了。但是,当我使用PhoneGap Build应用程序下载到我的iPhone时,它会转到“bsdi.SomeName”并崩溃,因为没有定义bsdi。我想我的定义bsdi库的方法是正确的,但很明显,PhoneGap中有些东西不喜欢这个。请注意,“isPhoneGap”为true,我们确实在设备上使用addEventListener。
非常感谢任何想法!
更新:在预感中,我尝试将bsdi对象移动到与使用它的代码相同的.js文件中。在这种情况下,它会找到对象并正确使用它。但是,当它是外部文件时,它会失败。是的,我已经三次检查文件是否存在并且位于正确的位置。再次,它在浏览器中工作正常!
答案 0 :(得分:0)
如果window.bsdi
未定义,那么(正如您的问题中所述)您的初始化代码永远无法确保代码所在时间window.bsdi
定义完了。它只是将这些属性添加到传入的新空对象中,但是一旦初始化函数完成,它就不会对任何东西产生任何影响。