检查孩子是否存在

时间:2011-01-04 19:07:39

标签: actionscript-3

您好我有以下功能:

private function seatClickHandler(e:MouseEvent):void{

            var check:Check = new Check();
            if(e.target.contains(check)){
                e.target.removeChild(seat);
            }else{
                e.target.addChild(check);
            }
        }

基本上我想检查e.target是否包含一个名为check的子项。如果它我想要e.target删除孩子,否则我想添加孩子。但我尝试的方法似乎没有工作,虽然我认为这是要走的路。有什么建议吗?

4 个答案:

答案 0 :(得分:2)

声明Check对象时,Actionscript会为该特定对象创建引用代码。

因此,第一次运行代码时,可以为Check对象提供@c0ecc29的引用。您的if语句会检查@c0ecc29是否为target的子组件。它不会,因此引用Check的{​​{1}}对象会添加到@c0ecc29

第二次调用target时,会创建一个clickHandler对象的新实例,该实例将具有 new 引用ID。您的目标具有带Check引用的原始Check对象,因此不会被删除。

实现此功能的正确方法取决于目标是什么(DataGrid,Group等)。

修改 根据你的评论,我会尝试这样的事情。它会检查@c0ecc29对象是否为Check的子对象,并在需要时添加它。然后,当单击target对象时,它将切换其可见性。

Check

如果您需要从public var check:Check = new Check(); private function seatClickHandler(e:MouseEvent):void { if(!e.target.contains(check)) { check.addEventListener(MouseEvent.CLICK, check_handleClick); e.target.addChild(check); } } protected function check_handleClick(event:MouseEvent):void { check.visible = !check.visible; } 实际删除Check对象,而不是仅仅更改其可见性,则可以尝试以下操作:

target

答案 1 :(得分:0)

如果孩子的名字为'check',那么您应该可以使用getChildByName()。见flash.display.DisplayObject.name

如果您碰巧将孩子留在记忆中,可以使用getChildIndex()

答案 2 :(得分:0)

check是该函数范围内的新对象,因此它不会是事件目标的子对象。

您要做的是将检查声明为全局变量(并将目标转换为DisplayObjectContainer)。

e.g。

private function seatClickHandler(e:MouseEvent):void{
                if((e.target as DisplayObjectContainer).contains(check)){
                    (e.target as DisplayObjectContainer).removeChild(seat);
                }else{
                    (e.target as DisplayObjectContainer).addChild(check);
                }
    }

但是我不确定这是不是你想要做的(只能有一张支票)。更好的方法是在目标上有一个函数(可能是toggleCheck),并让该显示对象负责渲染检查(并删除它)

答案 3 :(得分:0)

在我的情况下,这对我来说非常好:

if(possibleChild.parent == holder)
    holder.removeChild(possibleChild)

它可能正是您正在寻找的,也可能不是。