2

在舞台上,我有一个名为“mc”的电影剪辑,里面画了一个简单的矩形。mc 还有一个名为“btn”的子按钮,它是另一个简单的矩形(明显小于 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。

4

2 回答 2

1

除了在 dispatchEvent 中将 bubbles 参数设置为 false 之外,没有其他方法可以防止冒泡。

dispatchEvent(EVENT_TYPE, BUBBLES,....);

但是,您可以通过检查来避免冒泡。只需将下面的行作为侦听器函数的第一行,它就可以避免从除目标之外的所有对象调度的事件。

if(e.eventPhase != EventPhase.AT_TARGET) return;

因此,对于您的示例代码,当您单击按钮时,两个事件都会分派,但在mcDown函数中,它不会在上述行之后执行。

于 2012-09-10T11:55:01.097 回答
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
}

我认为这种方式效率更高,并且会更好更快地工作,并且系统过载的机会要小得多。

于 2012-09-09T14:40:35.363 回答