LeavingMe.net

AIR+Ajax 开发的一些细小的经验/心得/注意事项

2010-01-17 14:54:00

http://fins.javaeye.com/blog/481261 (针对 AIR 1.5.2 )  最后更新:10年1月7日  =======================================  一直想写一些关于 AIR+ajax开发的教程, 但是后来细细一想  写这样的教程实在多余 adobe官方提供的文档已经足够了(中英文都有)  开发人员只要具备一定的js功力 同时对AIR有一个准确的认识(不需要深入 至少要知道AIR是什么 以及如何下载和安装AIRSDK)  那么有下面两个地址  就足以掌握AIR+Ajax的开发了  [使用 HTML 和 Ajax 开发 Adobe AIR 1.5 应用程序](http://help.adobe.com/zh_CN/AIR/1.5/devappshtml/)  [针对 HTML 开发人员的 Adobe AIR 语言参考](http://help.adobe.com/zh_CN/AIR/1.5/jslr/index.html)  如果有时间和兴趣 也可以去  [HTML 和 Ajax 的 Adobe AIR 开发人员中心](http://www.adobe.com/cn/devnet/air/ajax/) 逛逛  (以上三个网址都是adobe官方提供)  所以 与其写教程 不如提炼出来一些小的经验/心得/注意事项来的有意义.  对于我来说 写起来容易 同时自己可以做个备忘  对于别人来说 如果遇到类似的问题 可以少走些弯路.  何乐而不为呢.  好 废话先说这些 下面进入正文(对有些人来说 正文同样是废话 呵呵)  注意: 以下针对AIR 1.5.2 for windows  写得很凌乱 如果大家看不懂 就先别看了 以后开发时 遇到问题可以过来瞧一瞧 看看我这篇备忘能不能帮上你什么忙.  =========================================  adobe官方提供的 AIRAliases.js 文件并没有包含所有air的api 的别名  例如这个  : window.runtime.flash.events.MouseEvent;  所以如果要用到它 可以自己手动指定一个 简写的别名  air.MouseEvent  =  window.runtime.flash.events.MouseEvent;  =========================================  标准的HTML text元素 到了AIR里 也不支持 undo/redo 了, 这个很烦  =========================================  某 dom元素 如 一个input框, 调用 dom.focus() 无法让dom获得焦点.  (此为bug, 2.0已修正)  解决方案 , 自己写一个 函数 用来实现这个功能 
Javascript代码 
  1. setFocus : function(el){  
  2.     var CUSTOMEVENTTYPE='GTA_FOCUS';  
  3.     var SET_FOCUS = function(event){  
  4.         event.target.focus();  
  5.     };  
  6.     var focusEvent = document.createEvent('HTMLEvents');  
  7.     focusEvent.initEvent(CUSTOM_EVENTTYPE, falsefalse);  
  8.   
  9.     el.addEventListener(CUSTOMEVENTTYPE, SETFOCUS , false);  
  10.     el.dispatchEvent( focusEvent );  
  11.     el.removeEventListener(CUSTOMEVENTTYPE, SETFOCUS, false);  
  12. }  

我就不说这个函数的思路了 让代码说话吧. 

========================================= 

AIR中的 XmlHttpRequest 请求本地文件 找不到时 报 101错误 而不是404  这个不是绝对  我换个说法吧:  如果大家在使用XHR请求资源时, 报了101错误 也许不是什么复杂的问题, 只是那个资源不存在而已.  (这样说更好吧 呵呵) 

======================================= 

AIR对 alt + 字母/数字键的处理很特殊, 部分按键会映射成小键盘上的按键 

keypress  事件中, 捕获不到alt键的状态  即使你按下了 alt+某一个按键, event.altKey也是false  (此为bug, 2.0已修正) 

======================================= 

keydown keyup时 event.charCode ==0  keypress 时  event.charCode == event.keyCode 

======================================= 

keydown keyup keypress  时, event.keyCode 总是一样的  (此为bug, 2.0已修正)  例如 AIR中    keydown keyup keypress 时 "-键"为189 ".键"为190  "A键"为65 

而其他浏览器中 keydown keyup一样,keypress和另两者不一样  例如 其他浏览器中    keydown keyup 时  "-键"为189 ".键"为190  "A键"为65    keypress时  "-键"为45 ".键"为46  "A键"为97 

=======================================  利用  window.addEventListener('keydown',HotKeyListener,true); 

大家可以自己比较容易的实现应用级的全局快捷键. 

注意;  1 要使用keydown, 而不是keypress (这个原因说来复杂... 试试就知道了 和我前面说的那些关于键盘事件的内容有关, 而且很多软件都是监听的keydown)  2 最后一个参数建议设置成true  否则快捷键可能会被window的子节点拦截 (如果有此需求 另当别论) 

HotKeyListener 指代自己实现的快捷键监听函数.  这个要想实现的好 还有很多细节需要处理 例如 快捷键的注册 反注册 冲突处理等等. 在这里暂不细说. 

=======================================  页面加载后 不允许 一些 eval 或 new Function 的执行  (详见 使用 HTML 和 Ajax 开发 Adobe AIR 1.5 应用程序 的第14章 AIR 安全性  这章非常非常重要, 熟悉js的人转过来搞air开发 最大的障碍可能就在这了  ) 

但是可以灵活的 运用 iframe +  childSandboxBridge/parentSandboxBridge 来绕开这个限制(并不是所有情况都可以绕开) 

关于相关的 思路 和方法 以后我有时间 而且有人希望了解的话,我再单独撰文吧 

=======================================  "动态同步载入js文件" 在AIR中 没有完美解决方案.  目前网上流行的 以及各大著名ajax框架采用的方法 在AIR中都有问题.  例如 

1 创建 <script src="....js" > 节点:  无法做到同步, 无论 defer怎么设置 , 都是异步. 

2 使用ajax加载js内容 然后 eval .  由于air 对eval的一些限制 这个方案不可行. 采用我前面说的SandboxBridge方案也不行. 

3 使用ajax加载js内容 然后塞入script节点内 作为内嵌script运行 也不行.也无法做到同步加载与执行.  (2.0中 此方法可行) 

======================================= 

AIR可以很轻松的获得 刚刚插入数据库(SQLite)的记录的主键, 这个特性要好好利用哦. 

Javascript代码 
  1. insertStmt.execute();   
  2. // get the primary key   
  3. var result = insertStmt.getResult();   
  4. var primaryKey = result.lastInsertRowID;   

=======================================  AIR的数据库 有同步和异步两种连接,从而实现数据库的同步或异步操作. 

但要注意  不要过度的使用异步数据库操作.  当然也不要闲置不用 浪费了如此优秀的特性. 

======================================= 

window.runtime.air.update.ApplicationUpdater 类的 initialize 方法是异步的.  想要在初始化之后 执行某动作 要使用事件监听的方式 监听 INITIALIZED 事件. 

=======================================  10年1月7日 新增:  清空 canvas 时,  使用 canvas.width=canvas.width 性能高于  context.clearRect(0, 0, canvas.width, canvas.height); 

======================================= 

先到这吧 如果有新的经验心得再补充 

comments powered by Disqus