在舞台上,我有一个名为“mc”的MovieClip,里面画了一个简单的矩形。 mc还有一个名为“btn”的Button子,这是另一个简单的矩形(显然小于mc的矩形)。然后我在舞台上有这个代码。
function mcDown( _e:MouseEvent):void{
trace( "mc" );
}
function btnClick( _e:MouseEvent):void{
trace( "btn" );
}
mc.addEventListener( MouseEvent.MOUSE_DOWN, mcDown );
mc.btn.addEventListener( MouseEvent.CLICK, btnClick );
我遇到的问题是当点击按钮时,mcDown事件也会被触发并跟踪“mc”和“btn”。
我怎样才能这样做,当我点击按钮时,它只触发btnClick而不是mcDown?我试过MOUSE_UP而不是CLICK,同样的问题。并且mcDown事件必须保持MOUSE_DOWN。
答案 0 :(得分:1)
除了在dispatchEvent中将bubbles参数设置为false之外,无法阻止冒泡。
dispatchEvent(EVENT_TYPE, BUBBLES,....);
但是,您可以通过检查来避免冒泡。只需将下面的行作为侦听器函数的第一行,它就可以避免从目标以外的所有对象调度的事件。
if(e.eventPhase != EventPhase.AT_TARGET) return;
因此,对于您的示例代码,当您单击按钮时,两个事件都会调度,但在 mcDown 函数中,它将不会在上述行之后执行。
答案 1 :(得分:0)
如果在MC中添加按钮,并且单击该按钮,则还可以单击MC,因为按钮下方的MC部分仍然存在,并且它会占用整个MC的功能,你不能删除它。
因此,最好制作一个能够检查按钮是否被按下的功能,否则它将运行整个MC的功能。
这个人应该这样做。
//add this in you constructor
mc.addEventListener(MouseEvent.MOUSE_DOWN, myReleaseFunc);
function myReleaseFunc(e:MouseEvent):void {
if(e.currentTarget.name == Btn1) //Btn1 is instance name for a button
{
Btn_func1();
}
else if(e.currentTarget.name == Btn2) //Btn2 is another button.
{
Btn_func2();
//For every button you'll need to add another function and if statement to check if that button was clicked.
}
else
{
Mc_func();
}
}
// this outside the main class
function Mc_func():void{
//you code here
}
function Btn_func1():void{
//you code here
}
function Btn_func2():void{
//you code here
}
我认为这种方式效率更高,效果更好,速度更快,系统重载的可能性也小很多。