您好我有以下功能:
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删除孩子,否则我想添加孩子。但我尝试的方法似乎没有工作,虽然我认为这是要走的路。有什么建议吗?
答案 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)
它可能正是您正在寻找的,也可能不是。