您会收到多个 FocusEvent,因为 TextArea 包含它控制的 TextInput。当您将焦点放在 TextArea 上时,焦点实际上被赋予了 TextInput,您会收到一个针对 TextArea 的焦点事件,以及另一个针对 TextInput 的焦点事件。
限制接收事件数量的最佳方法是检查事件的目标是否与您实际侦听的目标相同。
function onFocusIn(event:FocusEvent):void{
if (event.target == event.currentTarget) {
trace(event.target); // only the focus events generated by the TextArea.
}
}
编辑所以,我回到了关于点击问题的代码,实际的修复真的很棘手。事实上,错误的根源是各种相同问题的组合。
- 首先:TextArea 和内部 TextField 都在开始时发送 Event。
- 第二:开始之后,当TextField从点击中获得焦点时,它被父级阻止。
- 第三:当焦点来自瑞士法郎时,在你的情况下,焦点事件被发送两次(不知道为什么)。
为了正确修复它,我必须在 TextArea(而不是 TextArea 本身)中监听未知的 TextField,并跟踪离开舞台的焦点,以抑制生成的两个事件中的第一个。这给出了这个:
import flash.events.FocusEvent;
import fl.controls.TextArea;
var stageFocus:Boolean = true;
var field = new TextArea();
addChild(field);
var field2 = new TextArea();
field2.x = 150;
addChild(field2);
field.addEventListener(FocusEvent.FOCUS_IN, onFocusIn);
function onFocusIn(event:FocusEvent):void{
if (event.target == event.currentTarget) {
if (event.target is TextField) {
if (stageFocus) {
// Finally ! one event at a Time and no miss.
trace(DisplayObject(event.target).parent);
} else {
stageFocus = true;
}
}
} else {
event.target.addEventListener(FocusEvent.FOCUS_IN, onFocusIn);
field.removeEventListener(FocusEvent.FOCUS_IN, onFocusIn);
}
}
// check if the focus leave the stage (the user clic out of the swf)
stage.addEventListener(FocusEvent.FOCUS_OUT, onStageFocusOut);
function onStageFocusOut(event:FocusEvent) {
if (event.relatedObject == null) {
stageFocus = false;
}
}