域的应用(一)
2010年06月17日
域的应用
1. 加载到子域.
package{
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
/**
* SWF加载器
*/
public class SWFLoader extends EventDispatcher
{
private var m_loadinfo:LoaderInfo;
public function SWFLoader() {
}
public function Load(url:String):void {//加载SWF
var loader:Loader = new Loader();
var context:LoaderContext = new LoaderContext();
/** 加载到子域 */
context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain) ;
loader.contentLoaderInfo.addEventListener(Progress Event.PROGRESS, this.onProgress);
loader.contentLoaderInfo.addEventListener(Event.CO MPLETE, this.onComplete);
loader.contentLoaderInfo.addEventListener(IOErrorE vent.IO_ERROR, this.onError);
loader.contentLoaderInfo.addEventListener(Security ErrorEvent.SECURITY_ERROR, this.onError);
loader.load(new URLRequest(url),context);
}
public function get loadinfo():LoaderInfo{
return m_loadinfo;
}
/**
* 获取当前ApplicationDomain内的类定义
* name类名称,必须包含完整的命名空间,如 Grave.Function.SWFLoader
* info加载swf的LoadInfo,不指定则从当前域获取
* return获取的类定义,如果不存在返回null
*/
public function GetClass(name:String, info:LoaderInfo = null):Class {
try {
if (info == null) {
return ApplicationDomain.currentDomain.getDefinition(name ) as Class;
}
return info.applicationDomain.getDefinition(name) as Class;
} catch (e:ReferenceError) {
//trace("定义 " + name + " 不存在");
return null;
}
return null;
}
/**
* @private
* 移除加载事件
*
* @param inft加载对象的LoaderInfo */ private function RemoveLoadEvent(info:LoaderInfo):void { info.removeEventListener(Event.COMPLETE,onComplete ); info.removeEventListener(ProgressEvent.PROGRESS,on Progress); info.removeEventListener(IOErrorEvent.IO_ERROR,onE rror); info.removeEventListener(SecurityErrorEvent.SECURI TY_ERROR,onError); } /** 加载事件 */
private function onComplete(e:Event):void {
var info:LoaderInfo = e.currentTarget as LoaderInfo;
RemoveLoadEvent(info);
m_loadinfo = info;
this.dispatchEvent(e);
}
/** 加载中 */
private function onProgress(e:ProgressEvent):void {
this.dispatchEvent(e);
}
/** 出错事件 */
private function onError(e:Event):void {
this.dispatchEvent(e);
}
}
}
2. 测试类
package {
import flash.display.Sprite;
import flash.events.Event;
public class testLoader extends Sprite {
private var swfload : SWFLoader;
public function testLoader() {
//加载外部SWF
swfload = new SWFLoader;
swfload.Load("npc_shop_panel.swf");
swfload.addEventListener(Event.COMPLETE, onComplete);
}
//加载完成
function onComplete(e : Event) : void {
//这里是关键
/*swfload.loadinfo 注释:LoadInfo对象*/
/*TestMc 注释:读取应用程序域中的连接类名*/
/*调用SWFLoader中的GetClass方法 类已封装,传参数调用即可*/
var Tempclass : Class = swfload.GetClass("npc_shop_panel", swfload.loadinfo);
//实例化类库中的类
var mc : * = new Tempclass();
mc.x = 100;
mc.y = 100;
//还能调用该类中的动态文本
//mc.txt.text = "还能调用我里面的动态文本哩!";
this.addChild(mc);
}
}
}
2010年06月17日
域的应用
1. 加载到子域.
package{
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
/**
* SWF加载器
*/
public class SWFLoader extends EventDispatcher
{
private var m_loadinfo:LoaderInfo;
public function SWFLoader() {
}
public function Load(url:String):void {//加载SWF
var loader:Loader = new Loader();
var context:LoaderContext = new LoaderContext();
/** 加载到子域 */
context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain) ;
loader.contentLoaderInfo.addEventListener(Progress Event.PROGRESS, this.onProgress);
loader.contentLoaderInfo.addEventListener(Event.CO MPLETE, this.onComplete);
loader.contentLoaderInfo.addEventListener(IOErrorE vent.IO_ERROR, this.onError);
loader.contentLoaderInfo.addEventListener(Security ErrorEvent.SECURITY_ERROR, this.onError);
loader.load(new URLRequest(url),context);
}
public function get loadinfo():LoaderInfo{
return m_loadinfo;
}
/**
* 获取当前ApplicationDomain内的类定义
* name类名称,必须包含完整的命名空间,如 Grave.Function.SWFLoader
* info加载swf的LoadInfo,不指定则从当前域获取
* return获取的类定义,如果不存在返回null
*/
public function GetClass(name:String, info:LoaderInfo = null):Class {
try {
if (info == null) {
return ApplicationDomain.currentDomain.getDefinition(name ) as Class;
}
return info.applicationDomain.getDefinition(name) as Class;
} catch (e:ReferenceError) {
//trace("定义 " + name + " 不存在");
return null;
}
return null;
}
/**
* @private
* 移除加载事件
*
* @param inft加载对象的LoaderInfo */ private function RemoveLoadEvent(info:LoaderInfo):void { info.removeEventListener(Event.COMPLETE,onComplete ); info.removeEventListener(ProgressEvent.PROGRESS,on Progress); info.removeEventListener(IOErrorEvent.IO_ERROR,onE rror); info.removeEventListener(SecurityErrorEvent.SECURI TY_ERROR,onError); } /** 加载事件 */
private function onComplete(e:Event):void {
var info:LoaderInfo = e.currentTarget as LoaderInfo;
RemoveLoadEvent(info);
m_loadinfo = info;
this.dispatchEvent(e);
}
/** 加载中 */
private function onProgress(e:ProgressEvent):void {
this.dispatchEvent(e);
}
/** 出错事件 */
private function onError(e:Event):void {
this.dispatchEvent(e);
}
}
}
2. 测试类
package {
import flash.display.Sprite;
import flash.events.Event;
public class testLoader extends Sprite {
private var swfload : SWFLoader;
public function testLoader() {
//加载外部SWF
swfload = new SWFLoader;
swfload.Load("npc_shop_panel.swf");
swfload.addEventListener(Event.COMPLETE, onComplete);
}
//加载完成
function onComplete(e : Event) : void {
//这里是关键
/*swfload.loadinfo 注释:LoadInfo对象*/
/*TestMc 注释:读取应用程序域中的连接类名*/
/*调用SWFLoader中的GetClass方法 类已封装,传参数调用即可*/
var Tempclass : Class = swfload.GetClass("npc_shop_panel", swfload.loadinfo);
//实例化类库中的类
var mc : * = new Tempclass();
mc.x = 100;
mc.y = 100;
//还能调用该类中的动态文本
//mc.txt.text = "还能调用我里面的动态文本哩!";
this.addChild(mc);
}
}
}