如何在Flex动作脚本中确认文本输入
问题描述:
输入数字时,我可以侦听哪些TextInput事件以发出警报?该场景是:用户在myTxt1中输入一个数字。出现一条警报,提示“您确定要输入该号码吗?”。如果用户点击是,则什么都不做/继续。如果用户点击否,则关注myTxt1,以便他可以更改号码。如何在Flex动作脚本中确认文本输入
问题是,我不知道要听什么事情来抛出警报。我试过了valueCommit和focusOut。使用这两种方式时,警报会显示,但是当用户单击是时,即使该事件是由用户单击myTxt2触发的,焦点仍会保留在myTxt1上。用户试图离开myTxt1,但看到ALert,点击是,焦点仍然在myTxt1上,这是一个恶性循环。
这似乎是一个简单的问题,但我无法弄清楚。有什么建议?
答
在您的focusOut处理程序中,您必须存储将获得焦点的对象。这是因为当您显示警报时,此警报窗口现在已成为焦点,因此这些信息已消失。有关如何正确执行此操作,请参阅以下示例。我建议你建立一个做所有的工作适合你自己的自定义组件...
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.events.CloseEvent;
import mx.managers.FocusManager;
protected var previousValue:String;
protected var nextValue:String;
protected var focusInObject:InteractiveObject;
protected function isNumber(value:String):Boolean
{
// do your check
return true;
}
protected function textInput_focusOutHandler(event:FocusEvent):void
{
var value:String = TextInput(event.currentTarget).text;
if (!isNumber(value) || value == previousValue)
return;
nextValue = value;
focusInObject = event.relatedObject;
Alert.show("Are you sure you want to enter that number?", "", Alert.YES | Alert.NO, this, alertCloseHandler);
}
protected function alertCloseHandler(event:CloseEvent):void
{
if (event.detail == Alert.NO)
return;
previousValue = nextValue;
if (focusInObject)
systemManager.stage.focus = focusInObject;
}
]]>
</fx:Script>
<s:layout>
<s:VerticalLayout/>
</s:layout>
<s:TextInput focusOut="textInput_focusOutHandler(event)"/>
<s:CheckBox label="Foo"/>
<s:Button label="Bar"/>
</s:Application>
我已经包括一个小的优化。如果用户按是,应用程序会记住该值。如果您获得另一个focusOut事件并且该值自上次以来未更改,则不会显示该警报。
答
如果其中包含TextArea组件,您可以侦听更改事件。如果文本区域发生变化,则会触发更改事件。然后您可以检查哪个键被按下。
谢谢格哈德!这正是我正在寻找的解决方案,但(大但),我不能让它与我的代码工作。我有许多TextInput控件,用户将选中或单击以输入一系列数字。当我将另一个TextInput添加到代码中时,然后在第一个输入一个数字,然后单击第二个数字,我遇到了focusOutHandler中的一个问题。虽然event.relatedObject看起来不错,但focusInObject被设置为null,看起来有一个问题,将IFocusManagerComponent接口附加到TextInput上。 – Carrie 2010-10-25 01:05:01
你知道一个解决方法吗?我正在使用的代码(编辑了一下,所以我可以运行它作为一个Flex应用程序) – Carrie 2010-10-25 01:05:55
对不起,我不能粘贴在我的代码BC它太长,但我刚刚添加第二个TextInput后 – Carrie 2010-10-25 01:07:42