如何在 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 中确认文本输入的主要内容,如果未能解决你的问题,请参考以下文章

如何从 flex (mxml/actionscript?

在 ActionScript 3.5/Flex 中,如何将边框应用于用户单击的任何 UI 组件或容器?

在 ActionScript 和 Flex 中计算文本宽度

在 Flex/Actionscript 中捕获视频缩略图

如何使用非 MXML 而是 Actionscript 在 Flex 中创建动态状态并为其添加按钮?

如何将参数传递给 flex/actionscript 中的事件侦听器函数?