如何在 Flex actionscript 中确认文本输入
Posted
技术标签:
【中文标题】如何在 Flex actionscript 中确认文本输入【英文标题】:How to confirm text input in Flex actionscript 【发布时间】:2011-04-28 18:45:40 【问题描述】:当输入数字时,我可以监听哪些 TextInput 事件来引发警报?场景是:用户在 myTxt1 中输入一个数字。将出现一条警报,上面写着“您确定要输入该号码吗?”。如果用户单击是,则不执行任何操作/继续。如果用户单击否,则将焦点留在 myTxt1 上,以便他可以更改数字。
问题是,我不知道要听什么事件来引发警报。我试过 valueCommit 和 focusOut。使用这两种方法都会显示警报,但是当用户单击“是”时,焦点仍保留在 myTxt1 上,即使该事件是由用户单击 myTxt2 触发的。用户试图离开 myTxt1,但看到 ALert,点击 Yes,焦点仍然在 myTxt1,这是一个恶性循环。
这似乎是一个简单的问题,但我无法弄清楚。有什么建议吗?
【问题讨论】:
【参考方案1】:如果您试图阻止用户输入数字或以其他方式考虑使用restrict 属性。但是如果你只是想让用户在输入号码时得到通知,你可以使用change事件。
【讨论】:
【参考方案2】:在您的 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 事件并且自上次以来该值没有更改,则不会显示警报。
【讨论】:
谢谢格哈德!这正是我正在寻找的解决方案,但是(大但是),我无法让它与我的代码一起使用。我有许多 TextInput 控件,用户可以通过标签或单击来输入一系列数字。当我将另一个 TextInput 添加到您的代码中,然后在第一个中输入一个数字并单击第二个时,我在 focusOutHandler 中遇到了问题。我正在查看“focusInObject = ...”行。虽然 event.relatedObject 看起来不错,但 focusInObject 设置为 null。似乎将 IFocusManagerComponent 接口附加到 TextInput 时出现问题。 您知道解决方法吗?这是我正在使用的代码(稍作编辑,以便我可以将其作为 Flex 应用程序运行) 抱歉,我无法粘贴代码,因为它太长了,但我刚刚在您的第一个 TextInput 之后添加了第二个。 啊,我明白了。我没有注意到这个错误,因为它似乎只发生在mx:TextInput
上。好吧,我已经修改了我的代码示例。我现在存储 event.relatedObject
而不进行投射并直接使用 systemManager.stage.focus = focusInObject;
设置焦点【参考方案3】:
如果它是 TextArea 组件,您可以侦听更改事件。如果文本区域有任何更改,则会触发更改事件。然后您可以检查按下了哪个键。
【讨论】:
以上是关于如何在 Flex actionscript 中确认文本输入的主要内容,如果未能解决你的问题,请参考以下文章
在 ActionScript 3.5/Flex 中,如何将边框应用于用户单击的任何 UI 组件或容器?