有没有办法编写一个自定义事件,当用户在该自定义组件实例之外单击时触发该事件?基本上在主 flex 应用程序中的其他任何地方。谢谢。
4 回答
您可以使用该FlexMouseEvent.MOUSE_DOWN_OUTSIDE
事件。例如:
myPopup.addEventListener(
FlexMouseEvent.MOUSE_DOWN_OUTSIDE,
function(mouseEvt:FlexMouseEvent):void
{
PopUpManager.removePopUp(myPopup);
}
);
stage.addEventListener( MouseEvent.CLICK, stgMouseListener, false, 0, true );
...
private function stgMouseListener( evt:MouseEvent ):void
{
trace("click on stage");
}
private function yourComponentListener( evt:MouseEvent ):void
{
trace("do your thing");
evt.stopPropagation();
}
从森眼那里得到这个。我认为它适用于这个主题,至少它对我有用。jedierikb 的建议似乎是一样的,但有点不完整。
防止事件传播
如果要阻止事件进一步传播,可以使用 stopPropagation() (flash.events.Event.stopPropagation()) 或 stopImmediatePropagation() (flash.events.Event.stopImmediatePropagation( ))。这些方法是从传递给事件侦听器的事件对象中调用的,并且基本上阻止了事件的发生——至少在那个点之后。
stopPropagation 防止当前以外的任何对象接收事件,这可以在事件的任何阶段内。stopImmediatePropagation 做同样的事情,但也采取了额外的步骤来防止当前目标中的其他事件也接收事件发生。因此,当 stopPropagation 会阻止精灵 A 的父级接收事件时,stopImmediatePropagation 会阻止精灵 A 的父级以及侦听精灵 A 的任何其他侦听器接收事件。
示例:在使用 stopPropagation 和 stopImmediatePropagation ActionScript 代码之间切换:
var circle:Sprite = new Sprite();
circle.graphics.beginFill(0x4080A0);
circle.graphics.drawCircle(50, 50, 25);
addChild(circle);
circle.addEventListener(MouseEvent.CLICK, clickCircle1);
circle.addEventListener(MouseEvent.CLICK, clickCircle2);
stage.addEventListener(MouseEvent.CLICK, clickStage);
function clickCircle1(evt:MouseEvent):void {
evt.stopPropagation();
// evt.stopImmediatePropagation();
trace("clickCircle1");
}
function clickCircle2(evt:MouseEvent):void {
trace("clickCircle2");
}
function clickStage(evt:MouseEvent):void {
trace("clickStage");
}
单击圆圈并查看每种方法如何停止事件。stopPropagation 阻止舞台接收事件,而 stopImmediatePropagation 也阻止 clickCircle2 识别事件
正常输出
clickCircle1
clickCircle2
clickStage
停止传播输出
clickCircle1
clickCircle2
stopImmediatePropagation 输出
clickCircle1
Flex / Actionscript 3 - 在弹出锚点之外的任何地方单击鼠标时关闭弹出框
对于 4.6 SDK 试试这个..
frmPUA.popUp.addEventListener(FlexMouseEvent.MOUSE_DOWN_OUTSIDE, menuPopOutside, false, 0, true);
完整代码可在