TextArea にはそれが制御する TextInput が含まれているため、複数の FocusEvents を受け取ります。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 を送信するという事実。
- 2 番目 : 開始後、TextField がクリックからフォーカスを受け取ると、親によってブロックされます。
- そして3番目:フォーカスがswfの外から来るとき、あなたの場合、フォーカスイベントは2回送信されます(理由はわかりません)。
これを正しく修正するには、(TextArea 自体ではなく) TextArea 内の不明な TextField をリッスンし、生成された 2 つのイベントのうち最初のイベントを禁止するためにステージを離れたフォーカスを追跡する必要がありました。これは次のとおりです。
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;
}
}