如何将Focus_out事件应用于不仅仅是选定的组件

时间:2011-04-14 23:18:37

标签: flex actionscript-3 events focus mouseevent

我正在使用基于此post的代码。

它使用focus_out事件来检测是否存在需要提交的更改。但是我注意到只有在文本域中但在组件内部单击时才会调用FOCUS_OUT事件。有什么方法可以从组件内部听取组件外的点击吗?

    addEventListener(FocusEvent.FOCUS_OUT, onFocusOut);

    protected function onFocusOut(event:FocusEvent):void
    {
        _updatedText = text;

        if(_updatedText != _originalText){
            dispatchEvent(new Event(Event.CHANGE));
        }

        setEditable(false);
    }

2 个答案:

答案 0 :(得分:2)

在组件本身中,您可以这样做:

systemManager.addEventListener( FocusEvent.KEY_FOCUS_CHANGE, focusChangeHandler );
systemManager.addEventListener( FocusEvent.MOUSE_FOCUS_CHANGE, focusChangeHandler );

请确保在从舞台中删除组件之前清理并删除事件侦听器(假设它是动态添加的)。这将阻止你堆叠一堆事件监听器。

或者,如果您只是想在有人点击特定组件之外时发现,您可以执行以下操作:

systemManager.addEventListener( MouseEvent.MOUSE_DOWN, system_mouseDownHandler );

private function system_mouseDownHandler( event:MouseEvent ):void {
  if( !event.target != this && !this.contains(event.target as DisplayObject) ){
    // Do Something Here
  }
}

同样,如果动态添加/删除此组件,请确保清除所有事件侦听器。

希望这有帮助!

编辑:

如果要清理eventListeners,请执行以下操作(在组件中触发remove事件时调用):

<mx:Component remove="myRemoveHandler();" />

private function myRemoveHandler():void {
  if( systemManager.hasEventListener( MouseEvent.MOUSE_DOWN ) systemManager.removeEventListener( MouseEvent.MOUSE_DOWN, system_mouseDownHandler );
}

显然替换了你最终使用的事件监听器(Focus或Mouse)。

答案 1 :(得分:1)

在LabelEditor类中,在焦点上调度 Event.CHANGE 事件时,您可以只监听该事件