as3 textarea焦点事件错误

时间:2013-05-22 12:22:05

标签: actionscript-3 flash

我不确定它存在多久,它似乎刚刚第一次出现。 如果你创建一个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个跟踪声明吗? 知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分: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从点击中获得焦点时,它会被父母阻止。
  • 第三:当焦点来自swf时,在你的情况下,焦点事件发送两次(不知道为什么)。

为了正确地修复它,我必须在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;
    }
}