您会收到多个FocusEvents,因为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中的未知TextField(而不是TextArea本身),并跟踪离开舞台的焦点,以便禁止两个中的第一个生成的事件。这给出了这个:
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;
}
}
你试过event.stopPropogation()? –