首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Flash >

as3 载入外部swf 库文件同名被覆盖有关问题

2012-03-01 
as3 载入外部swf 库文件同名被覆盖问题两个flash文件A, BA中有库文件mc, B中也有库文件mcA中通过反射方式

as3 载入外部swf 库文件同名被覆盖问题
两个flash文件A, B

A中有库文件mc, B中也有库文件mc

A中通过反射方式"mc"将mc添加到主场景中
 var cc = ApplicationDomain.currentDomain.getDefinition("mc") as Class;
 addChild(new cc());
运行A,mc被成功添加到场景中

然后B通过loader加载A,
var loader = new Loader();
var context:LoaderContext = new LoaderContext();
context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
loader.load(new URLRequest("A.swf"), context);
addChild(loader);

发现A中通过反射方式添加的不是A.mc , 而是B.mc


有没有例子处理这样的情况, 避免子swf载入时库文件被主swf的同名库文件覆盖

[解决办法]
在使用此方法时需要注意区分域。给你一个实例,一看便知。
--------------------
如果有多个 SWF 文件中包含名称相同但实现方式不同的编译类,可以根据此示例将外部加载的 SWF 文件的类相互区分开来。先前,已指示子 SWF 使用 ApplicationDomain.currentDomain。在本例中,创建一个新的 ApplicationDomain,因此无论 SWF 第二次加载哪一个 Greeter 类,该类的属性和方法都不会替换第一个 Greeter 类的属性和方法。您可以通过修改 ClassLoader 的 load 方法中的 context.applicationDomain 属性来测试这一点。 
注意:

?由于 ClassLoader 类要加载 SWF 文件,因此需要文件系统级别的本地安全性。
?要运行此示例,必须存在两个名为 Greeter.swf 的 SWF 文件,分别位于“en”和“es”文件夹中。
使用以下代码在“en”目录下创建一个 Greeter.as 文件:

 package {
import flash.display.Sprite;
public class Greeter extends Sprite
{
public function Greeter()
{
}

public function greet():String {
return("Good Morning");
}
}
 }
 然后在“es”目录下创建一个十分相似的 Greeter.as 文件:

 package {
import flash.display.Sprite;
public class Greeter extends Sprite
{
public function Greeter()
{
}

public function greet():String {
return("Buenos Dias");
}
}
}
 编译两个 SWF 文件,然后实现以下代码:

package {
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.errors.IllegalOperationError;
import flash.events.Event;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;

public class ApplicationDomainExample2 extends Sprite {
private var spanishGreeterLoader:ClassLoader;
private var englishGreeterLoader:ClassLoader;
private var tf:TextField = new TextField();
private var greetersLoaded:uint = 0;

public function ApplicationDomainExample2() {
tf.autoSize = TextFieldAutoSize.LEFT;
addChild(tf);

spanishGreeterLoader = new ClassLoader();
spanishGreeterLoader.addEventListener(ClassLoader.LOAD_ERROR,loadErrorHandler);
spanishGreeterLoader.addEventListener(ClassLoader.CLASS_LOADED,classLoadedHandler);
spanishGreeterLoader.load("es/Greeter.swf");

englishGreeterLoader = new ClassLoader();
englishGreeterLoader.addEventListener(ClassLoader.LOAD_ERROR,loadErrorHandler);
englishGreeterLoader.addEventListener(ClassLoader.CLASS_LOADED,classLoadedHandler);
englishGreeterLoader.load("en/Greeter.swf");
}

private function loadErrorHandler(e:Event):void {
tf.text = "Load failed";
throw new IllegalOperationError("Cannot load the specified file.");
}

private function classLoadedHandler(e:Event):void {
greetersLoaded++;
if(greetersLoaded == 2) {
greet();
}
}

private function greet():void {
var spanishGreeter:Class = spanishGreeterLoader.getClass("Greeter");
var englishGreeter:Class = englishGreeterLoader.getClass("Greeter");
var greeter1 = new spanishGreeter();


var greeter2 = new englishGreeter();

tf.text = greeter1.greet() + "\n" + greeter2.greet();
}
}
}

import flash.display.Loader;
import flash.errors.IllegalOperationError;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;

class ClassLoader extends EventDispatcher {
public static var CLASS_LOADED:String = "classLoaded";
public static var LOAD_ERROR:String = "loadError";
private var loader:Loader;
private var swfLib:String;
private var request:URLRequest;
private var loadedClass:Class;

public function ClassLoader() {

loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler);
}

public function load(lib:String):void {
swfLib = lib;
request = new URLRequest(swfLib);
var context:LoaderContext = new LoaderContext();
// context.applicationDomain = ApplicationDomain.currentDomain;
context.applicationDomain = new ApplicationDomain();
loader.load(request,context);
}

public function getClass(className:String):Class {
try {
return loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class;
} catch (e:Error) {
throw new IllegalOperationError(className + " definition not found in " + swfLib);
}
return null;
}

private function completeHandler(e:Event):void {
dispatchEvent(new Event(ClassLoader.CLASS_LOADED));
}

private function ioErrorHandler(e:Event):void {
dispatchEvent(new Event(ClassLoader.LOAD_ERROR));
}

private function securityErrorHandler(e:Event):void {
dispatchEvent(new Event(ClassLoader.LOAD_ERROR));
}
}

[解决办法]
同意楼上。。。

热点排行