我有一個Canvas,裏面有很多組件,而且裏面有很多組件。如何以遞歸方式訪問兒童的孩子?
getChildren()僅返回頂級子級。檢索所有孩子(孩子的孩子的孩子等等)的最佳方法是什麼?
好吧,我不知道如何通過迭代孩子來做到這一點,但代碼非常混亂。我寧願使用一個很好的遞歸函數。有沒有人寫過這個?還是有一個Util類來做到這一點?
我有一個Canvas,裏面有很多組件,而且裏面有很多組件。如何以遞歸方式訪問兒童的孩子?
getChildren()僅返回頂級子級。檢索所有孩子(孩子的孩子的孩子等等)的最佳方法是什麼?
好吧,我不知道如何通過迭代孩子來做到這一點,但代碼非常混亂。我寧願使用一個很好的遞歸函數。有沒有人寫過這個?還是有一個Util類來做到這一點?
private function recuse(display : DisplayObjectContainer) : void {
if(display) {
for (var i : int = 0;i < _display.numChildren;i++) {
var child : DisplayObject = display.getChildAt(i);
trace(child.name);
if(child is DisplayObjectContainer) {
recuse(DisplayObjectContainer(child));
}
}
}
}
嘗試一些可能(注意,您可以遞歸返回列表,如果你要收集所有引用到頂級迭代)
function inspect(object:DisplayObject):void
{
if(object is DisplayObjectContainer)
{
var casted:DisplayObjectContainer = object as DisplayObjectContainer
trace("DisplayObjectContainer ", casted.name)
for(var depth:int = 0; depth < casted.numChildren;depth++)
{
inspect(casted.getChildAt(depth))
}
}else{
trace("DisplayObject", object.name);
}
}
inspect(this)
function theCallbackFunction(obj:DisplayObject):void
{
trace(obj.name);
}
//Visit the children first.
//Deep most objects will be visited first and so on.
//stage is visited at the end.
//Uses recursion
function depthFirst(obj:DisplayObject, func:Function):void
{
if(!(obj instanceof DisplayObjectContainer))
{
func(obj);
return;
}
var p:DisplayObjectContainer = DisplayObjectContainer(obj);
var len:Number = p.numChildren;
for(var i:Number = 0; i < len; i++)
{
var child:DisplayObject = p.getChildAt(i);
depthFirst(child, func);
}
func(obj);
}
//Visit the siblings first.
//stage is visited first, then its children, then the grand children and so on
//No recursion.
function breadthFirst(obj:DisplayObject, func:Function):void
{
var q:Array = [];
q.push(obj);
var p:DisplayObjectContainer;
var i:Number, len:Number;
while(q.length != 0)
{
var child:DisplayObject = queue.shift();
func(child);
if(!(child instanceof DisplayObjectContainer))
continue;
p = DisplayObjectContainer(child);
len = p.numChildren;
for(i = 0; i < len; i++)
q.push(p.getChildAt(i));
}
}
depthFirst(this.stage, theCallbackFunction);
breadthFirst(this.stage, theCallbackFunction);
這幾乎是同樣的解決方案不是嗎? – 2010-03-10 12:50:04
這工作順利,謝謝!更正:_display應顯示 – Yeti 2010-03-10 12:53:47
theo:是的,它看起來很相似,當我貼我的時候我沒有看到你的解決方案。所以我得到支票似乎有點不公平 – maxmc 2010-03-10 19:06:40