动态加载的phonegap.js问题

我正在尝试动态加载phonegap javascript文件(这样我可以选择在我使用Ripple时不在调试模式下加载它)但我正在遇到一些问题。

我使用普通的脚本标记加载jquery和jquerymobile javascript库。 在另一个脚本块中,我做:

function onDeviceReady() { alert("Device Ready!"); } $(document).ready(function() { alert("doc ready!"); $.getScript("js/phonegap.0.9.5.1.js", function() {alert("Got Phonegap!");}); document.addEventListener("deviceready", onDeviceReady, false); }); 

此代码警告它“Get Phonegap!” 但从不警告“设备就绪”。 使用jsconsole.com,我可以看到PhoneGap javascript对象存在。 但是,尝试调用device.uuid(或其他简单的phonegap API调用)失败 。 这几乎就像PhoneGap没有完全初始化。 看起来不应该是这种情况。 我错过了什么吗? 谢谢!

我遇到了类似的问题,我需要根据平台类型加载PhoneGap和相关的插件文件。 我浏览了PhoneGap源代码,发现它使用windows / browser事件来加载和准备对象。 如果我手动调用浏览器事件,那么它会初始化运行我的应用程序所需的PhoneGap对象(API和插件)。

以下使用Yabble的代码现在对我有用:

       

设备信息和插件调用在Android上运行正常。 虽然我还没有检查过所有的PhoneGap API,但截至目前我只需要这两个就可以工作了。

编辑

在Phonegap 1.5 / Cordova, PhoneGap.onPhoneGapInit.fire(); 因API更改而无法使用。 在我当前的测试中,大多数必需的对象在动态加载JS后没有任何变化。 此要点提供了更新的测试 – Cordova Lazy Load Test

最后我在不使用任何外部库的情况下使用它。

问题
对于多平台Phonegap项目,两个是从一个平台到另一个平台不同的部分:

  • 封装项目
  • Javacript Phonegap文件。

那些封装项目通常在项目过程中没有太大变化。 需要一个HTML5代码库,可以直接粘贴(或使用构建脚本)到依赖于平台的项目上。 由于javascript phonegap库位于Web文件集中,因此每次更换正确的文件真的很痛苦。

我的解决方案
在我的项目中,我有几个cordova文件,每个目标平台一个:

  • cordova.android.js
  • cordova.ios.js
  • cordoba.bb.js …

(注意这些文件中的每一个文件是如何包含在应用程序中的,即使它没有被使用。对我来说这不是问题,因为脚本捆绑在应用程序中,只有正确平台的脚本被加载到内存中)。

在我的页面中,我放置了加载器模块,而不是phonegap的脚本标签:

  

这将是phonegap-loader.js脚本。 我利用用户代理检测来动态地同步加载脚本:

  (function(){ var useragent = navigator.userAgent; if(/Android/i.test(useragent)){ loadScript('cordova.android.js'); } else if((/iPhone/i.test(useragent)) || (/iPad/i.test(useragent))){ loadScript('cordova.ios.js'); } ... // Else desktop browser is assumed and no phonegap js is loaded function loadScript(url){ // synchronous load by @Sean Kinsey // https://stackoverflow.com/a/2880147/813951 var xhrObj = new XMLHttpRequest(); xhrObj.open('GET', url, false); xhrObj.send(''); var se = document.createElement('script'); se.text = xhrObj.responseText; document.getElementsByTagName('head')[0].appendChild(se); } })(); 

同步加载脚本非常重要。 这给了我无数令人头疼的问题。 在实现这一点之前,我尝试在头部底部添加脚本标签,并使用$ .getScript,但没有工作,因为ondeviceReady未被触发。 看起来确保在动态加载时执行Phonegap脚本的唯一有效方法是@Sean Kinsey在这个惊人的答案中所显示的 (对他而言都是赞誉)。

唯一的缺点是脚本是内联的,但对我而言,最好是从容器中分离出核心HTML5应用程序,这是一个便宜的代价。

1)你试过在getScript之前调用addEventListener吗?

2)另外,您是否为您的设备使用了正确的phonegap.js? (在android上使用iphone phonegap.js时我有同样的’沉默’行为)

deviceready事件是一个特殊事件,由phonegap.js中的代码通过duck punching document.addEventListener处理,因此必须先加载phonegap.js,然后才能将事件附加到deviceready。

试试这个:

 function onDeviceReady() { alert("Device Ready!"); } $(document).ready(function() { alert("doc ready!"); $.getScript("js/phonegap.0.9.5.1.js", function() { alert("Got Phonegap!"); document.addEventListener("deviceready", onDeviceReady, false); }); }); 

在注入phonegap.js脚本后,通过运行以下javascript代码动态注入后,我能够模拟正确的PhoneGap初始化工作流程。

 if (document.readyState == "complete") { PhoneGap.onDOMContentLoaded.fire(); }