2013-05-22 49 views
0

我不知道这个存在了多久,它似乎刚刚第一次出现。 如果您创建了一个TextArea组件(作者或运行时)并将其专注,您将获得3个焦点事件。as3 textarea焦点事件bug

创建一个新的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个跟踪语句吗? 任何想法如何解决这个问题?

+0

你试过event.stopPropogation()? –

回答

1

您会收到多个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; 
    } 
} 
+0

谢谢。我明白TextArea的文本输入组合造成了2次(第一次为3次)事件,但是由于任何逻辑原因而丢失了。更糟糕的是,他们没有实现支持文本属性的通用界面。我正在做一个软键盘,所以这很痛苦。 我在类型测试中有类似的解决方案,但我喜欢你的event.target vs event.currentTarget好得多。 –

+0

我测试了你的解决方案,虽然这是一个改进,但仍然有些不可思议。 '函数onFocusIn(事件:FocusEvent)方法:无效{ \t如果(event.target == event.currentTarget){ \t \t迹(event.target); \t} }' 我第一次点击左边的字段时,我得到了跟踪信息,选择了其他信息后,我就没有任何东西了。但是,如果我使用Tab键,它每次都有效。 FocusManager不会更新关注对象或其他内容。 –

+0

哈,你是对的!它看起来像TextArea有许多奇怪的行为。看起来(第一次例外),来自TextField的FOCUS_IN事件不会被TextArea重复。我有一个修复,但它仍然不完美。一旦我完成了这个,我会编辑我的帖子。 – Aralicia