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

您会收到多个 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;
    }
}
于 2013-05-22T13:19:44.737 回答