Air中读取JavaScript的方法

最近项目中用到了Air读取JS文件的需求,研究了一下,给大家分享下。

Air中提供HTMLLoader 类,可以读取Html文件中的js方法,当你把Html载入进来的时候,就可以通过HTMLLoader获取js文件中提供的属性以及方法,

具体操作如下。

写AS文件

private var html:HTMLLoader = new HTMLLoader(); 
private var urlReq:URLRequest = new URLRequest("assets/test.html"); 
private function startLoadJS():void
{
  html.addEventListener(Event.COMPLETE, loadComplete); 
  html.load(urlReq); 
}
private function loadComplete(e:Event):void{ 
  trace(html.window.bbq);
  trace(html.window.transToDB("一条弯弯的河"));
}

再写一个HTML文件放置在aeests目录下,文件中可以只含也可以包含JS代码

<script> 
    var bbq = "O,THANK YOU"
    function transToDB(str){
        return "哥哥面前"+str;
    }
</script>

运行结果:

“O,THANK YOU“
"哥哥面前一条弯弯的河”

当我尝试把test.html修改名称为test.js或者其它扩展名,就无法实现

想读取js内方法,只能支持扩展名为Html吗?

 

近日研究发现,其实也可以跳过Html,使用HtmlLoader.window.eval(),可以直接运行JS脚本

方法如下

private var htmlLoader:HTMLLoader=new HTMLLoader(); 
private var jsUrl:URLRequest = new URLRequest("assets/test.js");
private function evalFunction():void
{
    var jsLoader:URLLoader = new URLLoader();       
jsLoader.addEventListener(Event.COMPLETE,jsLoadComplete); jsLoader.dataFormat
=URLLoaderDataFormat.TEXT; jsLoader.load(jsUrl); } private function jsLoadComplete(e:Event):void { var jsStr:String = e.currentTarget.data as String; htmlLoader.window.eval(jsStr); jsClass = new htmlLoader.window.test(); trace(jsClass.run()) }

JS文件为

var test = (function () {
    function test() {
    }
    test.prototype.run = function () {
        return "test.js中的run函数";
    };
    return test;
})();

运行结果

test.js中的run函数

html我们是抛弃了,那么接下来,又遇到一个棘手的问题,一旦js文件有错误,那么我们在AS里能不能侦听到然后停掉js运行呢,

经过多次试验,在As中添加try catch,根本侦听不到js中的错误,只能在js中添加try catch,切记切记

因为在AS中无法侦听到js中的Crash,所以,我添加了一个trace,可以侦听到js中输出的内容,方便调试

AS代码如下

htmlLoader.window.Console={};
htmlLoader.window.Console.log = function(message:*):void
{
    trace("AS中ConsoleLog:"+message);
}

JS文件变为

var test = (function () {
    function test() {
    }
    test.prototype.run = function () {
        Console.log("JS中的ConsoleLog");
        return "test.js中的run函数";
    };
    return test;
})();

运行结果

AS中ConsoleLog:JS中的ConsoleLog
test.js中的run函数

这样,就解决了在AS中调试JS的方法。

再补充一点,虽然AS停不了js的执行,但是可以用HtmlLoader的HTMLUncaughtScriptExceptionEvent.UNCAUGHT_SCRIPT_EXCEPTION事件侦听到js中报的错误。你也仅限于可以侦听到,并不能打断JS的运行。

关于AS读取JS的官方解释:

在桌面计算机上(在桌面和扩展的桌面配置文件中),HTMLLoader 类使用内部 AIR WebKit 引擎。

其可用的功能和呈现外观与 StageWebView 类相同,并且在 ActionScript 和 javascript 之间实现了紧密集成和脚本桥接。

由于 StageWebView 类使用 Flash Player 插件提供的系统 web 控件,因此强烈建议不要同时使用 StageWebView 和 HTMLLoader 实例,否则会发生未定义的行为,从而可能使应用程序终止运行。

 GitHub地址:https://github.com/yuxinliang/AirLoadJS

 

posted on 2015-08-06 14:14  西北风Yukin  阅读(460)  评论(0编辑  收藏  举报