在使用mx.validator包的时候,我一直都希望检测没有通过的错误信息能够直接显示出来,而不是等我把鼠标移动到没有通过的组件上再显示。我认为这能带给用户更好的体验。因为用户能在第一时间就知道自己到底填错了什么,况且,并不是所有的用户都知道必须把鼠标移动到出错的组件上才能看到错误信息的。很多用户在控件的边框变红,并且不能够继续提交之后不知所措。(我认为,那个红色并不明显,还不至于让用户知道必须把鼠标移动到组件上去,尤其是在页面中的组件相当多的时候……)
关键在于ToolTipManager类的使用。使用ToolTipManager类的createToolTip方法可以直接生成一个ToolTip进行显示。语法很简单,只需要指定要显示的文字,x、y值即可。如果坐标值是基于组件的,则需要使用localToGlobal来转换坐标系。
一个有趣的地方是ToolTip的箭头方向。createToolTip的第4个参数是指定箭头。如果为空,就不显示箭头。如果为下面三个字符串值中的一个,则会显示箭头:
- errorTipAbove
- errorTipRight
- errotTipBelow
是的,没有errorTipLeft。
另一个有趣的地方是关于ToolTip的样式。对于createToolTip生成的ToolTip,可以用ToolTip选择符控制它的样式。但是这还取决于createToolTip的第4个参数。如果这个参数有值,那么就必须使用.errorTip这个css类来控制它的样式了。
1 2 3 4 |
.errorTip { font-size: 12; } |
.errorTip会影响Validator的样式,所以,可以重新定义专有样式,并在生成toolTip的时候赋值给它。
1 2 3 4 5 6 7 8 |
.testTip { font-size: 12; border-color: #ffffdd; color: #ff0000; font-weight: bold; } _tip.styleName = 'testTip'; |
createToolTip生成的ToolTip,必须用destoryToolTip来清除。如果在清楚之前再次调用createToolTip,则会生成重复的ToolTip。ToolTipManager有一个currentToolTip属性来保存当前显示的ToolTip,但这个属性对于使用createToolTip创建的ToolTip并没有效果。因此还是老老实实的在生成的时候用变量把它保存下来把。
源码:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" width="400" height="150" horizontalAlign="center" verticalAlign="middle">
<mx:Style>
global
{
font-size: 12;
theme-color: haloSilver;
}
Application
{
background-color: #dddddd;
}
.errorTip
{
font-size: 12;
}
.testTip
{
font-size: 12;
border-color: #ffffdd;
color: #ff0000;
font-weight: bold;
}
</mx:Style>
<mx:Script>
<![CDATA[
import mx.managers.ToolTipManager;
import mx.controls.ToolTip;
private var _tip:ToolTip;
private function _showTip($txt:String):void
{
trace(_tip);
if(_tip == null)
{
var __point:Point = new Point(emailTI.x, emailTI.y);
trace(__point)
__point = emailTI.localToGlobal(__point);
trace(__point);
_tip = ToolTipManager.createToolTip( $txt,
__point.x - emailTI.x,
__point.y - 40 ,
'errorTipAbove') as ToolTip;
_tip.styleName = 'testTip';
}
}
private function _destoryTip():void
{
if(_tip)
{
ToolTipManager.destroyToolTip(_tip);
}
_tip = null;
}
]]>
</mx:Script>
<mx:EmailValidator id="emailV" source="{emailTI}" property="text" trigger="{btn}" triggerEvent="click"/>
<mx:Form horizontalCenter="0">
<mx:FormItem label="电子邮件:" width="100%">
<mx:TextInput id='emailTI' width="100%"/>
</mx:FormItem>
<mx:FormItem horizontalAlign="center" width="100%" direction="horizontal">
<mx:Button id="btn" label="提交"/>
<mx:Button id='btn2' label="显示Tip" click="_showTip('测试弹出Tip')"/>
<mx:Button id='btn3' label="取消Tip" click="_destoryTip()"/>
</mx:FormItem>
</mx:Form>
</mx:Application>
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步