trace("gotoAndStop function executed at: " + getTimer());
var m:DisplayObject = ch.getChildAt(0);
if (m)
{
trace("i have child at 0!");
}
else
{
trace("oops, nothing there...");
}
function handleChildRemoved(e:Event):void
{
trace("removed some children!");
}
function handleChildAdded(e:Event):void
{
var t:int = getTimer();
var target:DisplayObject = e.target as DisplayObject;
//当有新的显示对象被添加到显示列表,会trace出信息
trace(target + " added at: " + t);
}第四步: 把发布设置成: Flash Player 10, ActionScript 3.0
然后 Ctrl + Enter or Command + Enter,看output输出的信息:
removed some children!
[object Shape] added at: 5
[object MovieClip] added at: 5
run timeline actionscript at: 5
typeof c at frame 2 is:number
gotoAndStop function executed at: 6
i have child at 0!
this frame 3再把发布设置改成:Flash Player 9, ActionScript 3.0
然后 Ctrl + Enter or Command + Enter,看output输出的信息:
removed some children!
gotoAndStop function executed at: 6
oops, nothing there...
[object Shape] added at: 6
[object MovieClip] added at: 6
run timeline actionscript at: 6
typeof c at frame 2 is:number
run timeline actionscript at: 6
typeof c at frame 2 is:number
this frame 3通过上面的测试,会发现之前没有留意的细节:
1、Flash Player 10 和 Flash Player 9 在 gotoAndStop 方法调用之后执行的方式非常不同。 通过上面的图示可以看出Flash Player 9和10之间在跳帧的时候执行逻辑的差异,Flash Player 9相当于在跳帧的时候异步执行了该帧上的脚本,也许是出于优化性能的考虑,但是这给开发带来了很多麻烦,比如每次跳帧的时候需要检查显示对象是否已经被添加到了显示列表当中,通过 Event.ADDED事件进行这一恶心麻烦的判断。相比之下 Flash Player 10的逻辑就清晰很多,开发不用担心上面说的问题。
2、Flash Player 9 第二帧的脚本被执行了两次(WTF~)!
这个着实让我想不明白,暂且作为这篇文章的一个遗留问题吧,希望各位高手一起来看是为什么。