0

これがどのくらいの期間存在したかはわかりませんが、初めて登場したようです。TextArea コンポーネント (作成者またはランタイム) を作成してフォーカスを与えると、3 つのフォーカス イベントが発生します。

新しい as3 fla を作成し、TextArea コンポーネントをライブラリにドラッグして、これをフレーム 1 に貼り付けます。

import flash.events.FocusEvent;
import fl.controls.TextArea;

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{
    trace(event.target);
}

左のフィールドをクリックします。3 つのトレース ステートメントが表示されますか? これを修正する方法はありますか?

4

1 に答える 1

1

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;
    }
}
于 2013-05-22T13:19:44.737 に答える