我建的项目叫bridge,里面有我所有的js文件,还有不少as文件,细心的发现每一个js文件旁边都有一个...Stream.as文件,这里就是重点了,我们如何才能把js文件打包到swc里面呢,flex提供了一种流的方式,例如上面的ApplicationManager.js文件,我们创建一个类ApplicationManagerStream继承于flash.utils.ByteArray,代码如下:
复制代码 代码如下:
package SuperMap.Js 
{ 
import flash.utils.ByteArray; 
/** 
* 制定js文件以及打包方式 
*/ 
[Embed(source="ApplicationManager.js", mimeType="application/octet-stream")] 
public class ApplicationManagerStream extends ByteArray 
{ 
public function ApplicationManagerStream() 
{ 
super(); 
} 
} 
}
写好你对应的js文件,一定要和此类放在一个文件夹下,配上打包的类型application/octet-stream,每一个js文件都配置一个相应的as类,这样在

现在问题又来了,里面是二进制的东西,我们如何使用啊,不是我们平时写的as类,写了什么方法引用这个包直接使用就行。
所以我们还需要一个as类。这里我创建IncludeStream.as,代码如下:
复制代码 代码如下:
package SuperMap 
{ 
import SuperMap.Js.ApplicationManagerStream; 
import SuperMap.Js.HashTableStream; 
import SuperMap.Js.SceneDivStream; 
import SuperMap.lib_Ajax.IServerJava6RStream; 
import SuperMap.lib_Ajax.JsStream; 
import SuperMap.lib_Ajax.MicrosoftAjaxStream; 
import SuperMap.lib_Realspace.RealspaceStream; 
/** 
* 此类主要用于以字符串形式获取二进制形式的js代码 
*/ 
public class IncludeStream 
{ 
/** 
* 构造函数 
*/ 
public function IncludeStream() 
{ 
} 
/** 
* 返回js文件里面代码的字符串形式 
*/ 
public function toString():String 
{ 
var microsoftAjaxStream:MicrosoftAjaxStream=new MicrosoftAjaxStream(); 
var jsStream:JsStream=new JsStream(); 
var iServerJava6RStream:IServerJava6RStream=new IServerJava6RStream(); 
var realspaceStream:RealspaceStream=new RealspaceStream(); 
var hashTableStream:HashTableStream=new HashTableStream(); 
var applicationManagerStream:ApplicationManagerStream=new ApplicationManagerStream(); 
var sceneDivStream:SceneDivStream=new SceneDivStream(); 
return microsoftAjaxStream.toString()+jsStream.toString()+iServerJava6RStream.toString()+realspaceStream.toString()+hashTableStream.toString()+applicationManagerStream.toString()+sceneDivStream.toString(); 
} 
} 
}
有了这个类,我们可以通过实例化一个此对象,然后通过方法toString()获取到字符串形式的js的所有代码。这又是一个问题,我们还是不能使用,没法调用。不过先这样打包好,引用到你的flex项目里面再说。
三、调用js文件
首先我们要知道as调用js的方法只能调用js形式的方法,也就是嵌入到了html页面的js,而现在我们只有字符串形式的js源代码,所以需要想办法将它转化为标准的js代码,嵌入到html页面里面。
在你的flex项目启动的最开始的地方恰如如下代码:
复制代码 代码如下:
//初始化一个字符串形式的方法parseStringToJs,用于将字符串转换为js语言 
var str:String = "function parseStringToJs(str){var oHead = document.getElementsByTagName('HEAD').item(0);"; 
str+="var oScript = document.createElement(\"script\");"; 
str+="oScript.language = \"javascript\";"; 
str+="oScript.type = \"text/javascript\";"; 
str+="oScript.id = \"test\";"; 
str+="oScript.defer = true;"; 
str+="oScript.text = str;"; 
str+="oHead.appendChild(oScript);}"; 
//调用window.eval方法 
ExternalInterface.call("eval",str); 
var includeStream:IncludeStream=new IncludeStream(); 
//获取js的字符串形式的源代码 
var strey:String=includeStream.toString(); 
//使用正则表达式修改字符串 
var char:RegExp = /\\/g; 
strey = strey.replace(char,"\\\\"); 
//生成js的API 
ExternalInterface.call("parseStringToJs",strey); 
//初始化js调用as的入口方法initBridgeJsToFlex,最终饭方法的实现转给方法ApplicationManager.initBridgeJsToFlex 
ExternalInterface.addCallback("initBridgeJsToFlex",ApplicationManager.initBridgeJsToFlex);
注释已经写的很清楚了,不过正则表达式这一步可以不要,我这里是因为我的代码里出现了反斜杠的东西,所以我这样是为了转义一下,这里的思路就是先使用ExternalInterface.call去调用window对象的方法eval在window下创建一个将字符串转化为js代码的方法parseStringToJs,然后再调用此方法将我们的字符串的源代码进行转化,这样html中就存在js的代码了,就不用再去修改index.template.html文件添加引用和添加入口了。并且在其他地方你可以通过ExternalInterface.call直接调用js端公开的桥,并且通过ApplicationManager.initBridgeJsToFlex来接收js的回调函数,这样我们只需要添加swc这个包就可以使用js的所用功能。
