我个人会用 MovieClipLoader 来做这件事。使用计时器来假设加载持续时间是非常危险的,因为它会产生竞争条件,连接速度非常慢的用户将会失败。
这是一个简单的示例,使用 MovieClipLoader 和 Delegate 将事件函数的范围保持在代码的其余部分本地,就像在 AS3 中的 addEventListener 一样。首先,要加载的 SWF,我称之为“child.swf”。这包含一个动画,在第 1 帧它定义了一个名为 'hello' 的字符串变量:
var hello:String = "Hi";
在父 SWF 中,我们将拥有加载程序代码和一个标识符为“mc1”的库项目,它将附加到加载的 SWF 上方的舞台。
//grab Delegate to mimic AS3 event handler scope
import mx.utils.Delegate;
//create container for the loaded SWF
var loadedMC:MovieClip = createEmptyMovieClip("loadedMC",5);
//create the loader (don't cast it though, or you can't directly access the events)
var loader = new MovieClipLoader();
//set up a listener for the load init (called when the first frame of the loaded MC is executed)
loader.onLoadInit = Delegate.create(this, onMovieInit);
//start loading
loader.loadClip("child.swf",loadedMC);
//init handler
function onMovieInit()
{
//create the next layer from the library
var firstMC:MovieClip = attachMovie("mc1","newName",10);
//trace var from loaded mc
trace(loadedMC.hello); // hi
}
MovieClipLoaderonLoadInit
在目标 SWF 已加载且第一帧已处理后调用该函数,这意味着第一帧上的任何代码现在都可用于父 SWF。委托调用onLoadInit
而不是使用监听器对象作为官方文档希望您删除_root
在处理程序函数中使用的要求,因为函数的范围没有改变。