AS3遍历舞台中的所有显示对象
AS3遍历舞台中的所有显示对象:今天在《AS3入门与精通》第202页看到用递归来遍历舞台的显示列表的方法,尝试把代码打了一遍,结果报错:1119: 访问可能未定义的属性 numChildren (通过 static 类型 flash.display:DisplayObject 引用)。1061: 调用可能未定义的方法 getChildAt (通过 static 类型 flash.display:DisplayObject 引用)。去掉“严谨模式”的钩之后,输出:
root1
instance1
instance2
ReferenceError: Error #1069: 在 flash.display.Shape 上找不到属性 numChildren,且没有默认值。
at _fla::MainTimeline/tracedp()
at _fla::MainTimeline/tracedp()
at _fla::MainTimeline/tracedp()
at _fla::MainTimeline/tracedp()
at _fla::MainTimeline/_fla::frame1()
后来就这个问题请教了一下我的安徽老乡,因为她很聪明的。果然,老乡马上就发现是Shape而不是容器的原因。经她提醒,我想到在舞台上创建的各个影片剪辑实例虽然有嵌套关系,但它们的最里层都是用创作工具画的图,这些图的确没有numChildren属性。可是怎么办呢?
老乡说可以加个判断,在确认子实例是容器时再递归调用。这办法还真好用,我加了一句,这个问题解决了。
最后代码如下:
tracedp(stage);
//传入实参,stage,最顶层的容器
function tracedp(dp:DisplayObject):void {
var len:int=dp.numChildren;
//保存容器的子实例的个数
if (len) {
//当子对象不为0时开始循环
for (var i:int=0; i<len; i++) {
var d:DisplayObject=dp.getChildAt(i);
//获取所有的子实例
trace(d.name);
//输出实例的名字
// tracedp(d);
(d is DisplayObjectContainer)?tracedp(d):0;
//当子实例的类型也是显示对象容器时,递归调用本函数
}
}
}
但是要注意:这段代码也仅仅是在非“严谨模式”下可以测试,因为指定的函数的形参类型是DisplayObject,这种类型并不一定就是容器,所以“严谨模式”下会报第4行和第9行错误。(同上方:访问可能未定义的属性numChildren和调用可能未定义的方法getChildAt(i))
本文地址:http://www.lxlong.net/archives/2373.html 本文标题:AS3遍历舞台中的所有显示对象
2条评论 ▼