为啥这个 Javascript 库在浏览器中可用,但在 PhoneGap 中不可用?

Posted

技术标签:

【中文标题】为啥这个 Javascript 库在浏览器中可用,但在 PhoneGap 中不可用?【英文标题】:Why is this Javascript library available in browser but not in PhoneGap?为什么这个 Javascript 库在浏览器中可用,但在 PhoneGap 中不可用? 【发布时间】:2015-06-22 19:01:13 【问题描述】:

我在 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”为真,我们确实在设备上使用了 addEventListener。

非常感谢任何想法!

更新:凭直觉,我尝试将 bsdi 对象移动到与使用它的代码相同的 .js 文件中。在这种情况下,它会找到对象并正确使用它。但是,当它是外部文件时,它会失败。是的,我已经三次检查该文件是否存在并且位于正确的位置。同样,它在浏览器中运行良好!

【问题讨论】:

【参考方案1】:

如果 window.bsdi 未定义,那么(如您的问题中所发布)您的初始化代码永远不会确保在代码完成时 window.bsdi 定义的。它所做的只是将这些属性添加到传入的新空对象中,但是一旦初始化函数完成,这将不会对任何内容产生任何影响。

【讨论】:

是的 - 让我感到奇怪的是空对象会被分配 bsdi。问题是:我如何确保在使用它的人之前加载它?另外 - 我改用变量,但没有效果。 你可以在你的函数中明确设置window.bsdi = bsdi;。如果它已经定义,那不会有任何伤害,但如果没有定义,它会确保它被定义。

以上是关于为啥这个 Javascript 库在浏览器中可用,但在 PhoneGap 中不可用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Ruby 的 bcrypt 库在哈希中包含明文中的盐? [复制]

为啥我在使用 jQuery Validate 时会出现这个 JavaScript 错误?

为啥 Boost 库在其线程屏障的实现中使用 m_ge​​neration 变量?

为啥javascript不会在while循环中堆叠

我写的javascript正则表达式为啥匹配不了我的数字?

为啥我可以链接两个库在 VC 中导出相同的 C-Function?