PhoneGap 1.5版本 cordova.js 简析 3(转)

原文:http://peng-jiesi.iteye.com/blog/1494079

在基本升级了phonegap1.5后,发现原有的phonegap插件基本还是能够工作的,而因为项目原因我需要重写phonegap的定位能力,却发现无法找到类似phonegap 1.4的定义代码 

Js代码  收藏代码
  1. PhoneGap.addConstructor(function() {  
  2.             navigator._geo = new Geolocation();  
  3.   
  4.             // No native geolocation object for Android 1.x, so use PhoneGap  
  5.             // geolocation  
  6.             if (typeof navigator.geolocation === 'undefined') {  
  7.                 navigator.geolocation = navigator._geo;  
  8.                 Geolocation.usingPhoneGap = true;  
  9.             }  
  10.   
  11.             //Geolocation.usePhoneGap();  
  12.         });  




进过分析发现phonegap通过一个'cordova/common'模块保证我们继续可以使用navigator.geolocation来访问函数.在phonegap1.5 js代码的最后实现了一个self.boot的方法,当onNativeReady时触发,下面就是其中的主要功能 -- 扩展window对象 

Js代码  收藏代码
  1. // Drop the common globals into the window object, but be nice  
  2. // and don't overwrite anything.  
  3. builder.build(base.objects).intoButDontClobber(window);  
  4.   
  5. // Drop the platform-specific globals into the window object and  
  6. // do it like a honey badger does it.  
  7. builder.build(platform.objects).intoAndClobberTheFOutOf(window);  
  8.   
  9. // Call the platform-specific initialization  
  10. platform.initialize();  




整个过程分成了三部分, 构建共用对象,构建平台(IOS, android等)对象,初始化平台参数. 而前两者都是通过'cordova/builder'组建实现.通过分析该组建可以发现其中最重要的函数为include,代码如下 

Js代码  收藏代码
  1. function include(parent, objects, clobber) {  
  2.     each(objects, function(obj, key) {  
  3.                 try {  
  4.                     var result = obj.path ? require(obj.path) : {};  
  5.   
  6.                     if (clobber) {  
  7.                         // Clobber if it doesn't exist or if an  
  8.                         // override is specified.  
  9.                         if (typeof parent[key] === 'undefined'  
  10.                                 || typeof obj.path !== 'undefined') {  
  11.                             parent[key] = result;  
  12.                         }  
  13.                         result = parent[key];  
  14.                     } else {  
  15.                         // Don't clobber if something already exists  
  16.                         // there  
  17.                         if (typeof parent[key] == 'undefined') {  
  18.                             parent[key] = result;  
  19.                         } else {  
  20.                             // Set result to what already exists, so  
  21.                             // we can build children into it if they  
  22.                             // exist.  
  23.                             result = parent[key];  
  24.                         }  
  25.                     }  
  26.   
  27.                     if (obj.children) {  
  28.                         include(result, obj.children, clobber);  
  29.                     }  
  30.                 } catch (e) {  
  31.                     alert('Exception building cordova JS globals: '  
  32.                             + e + ' for key "' + key + '"');  
  33.                 }  
  34.             });  
  35. }  



通过include函数,程序会把在common中定义的object下的所有对象通过path初始化后以属性的方式添加进windows里面,但是如果window对象中存在了该属性则不会被覆盖.同时一个功能如果需要存在子结点,则必须放在obj.children里(同path同级)否则无效. 


接着程序会将platform的object下对象,以覆盖的方式添加进window中,主要包括以下几个属性 

Js代码  收藏代码
  1. window.cordova.JSCallback : "cordova/plugin/android/callback"  
  2. window.cordova.JSCallbackPolling : "cordova/plugin/android/polling"  
  3. window.navigator.app : "cordova/plugin/android/app"  
  4. window.device : "cordova/plugin/android/device"  
  5. window.File : "cordova/plugin/File"  
  6. window.FileReader : "cordova/plugin/FileReader"  
  7. window.FileError : "cordova/plugin/FileError"  



而如我开始的需求,则需要将 navigator.geolocation 从common 移到 platform中保证在android平台强制使用扩展的定位能力,而非浏览器自带的. 

posted on 2012-08-15 14:50  亭子  阅读(425)  评论(0编辑  收藏  举报

导航