我正在使用基于此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);
}
答案 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 事件时,您可以只监听该事件