原文地址:http://blog.csdn.net/kunoy/article/details/8007585

本文主要解决问题:

1、区分哪些文本框不允许为空,很多网站都采用在文本框后加*号,extjs也可以用lable组件标识,但这样做很麻烦,每一个不允许为空的文本框都需要多加一个lable组件,如果用一个方法自动为不允许为空的文本框加上这个*号,在form等布局的情况下,也是可行的,但如果是absolute布局,你会发现界面就不那么舒畅了。

2、添加文本框验证错误提示,如果你采用的是form布局,extjs已经自带了在文本框后加一个红色感叹号的提示,但往往很多界面采用的是absolute布局,这时红色感叹号就打死也不会出现了,本文就解决这一问题,并且在点击保存时统一验证每一个文本框,如果存在验证错误,提示错误信息并返回。

extjs自带的在form布局下的错误提示:

首先定义样式:

设置不允许为空的文本框属性如下:

当然如果一个界面需要设置的textField太多,可定义方法:

Ext.ComponentMgr.all.each(function(cmp){

var Type=cmp.getXType();         if(Type=='textfield'||Type=='fileuploadfield'||Type=='combo'||Type=='treecombo'||Type=='datefield'||Type=='numberfield'||Type=='textarea'||Type=='timefield'||Type=='trigger'){

if(cmp.allowBlank==false){

cmp.cls="Diy-text";

cmp.blankText="该输入项不能为空!";

}

}

});

}

初始化调用setDiyTextField()即可,效果如下:


        说明:这里使用background-image,强制覆盖了extjs自己的文本框样式,不仔细看,其实差别很小。

        下面该定义validateValue方法了,代码如下:

Ext.form.TextField.prototype.validateValue = function(value){

var iconid=this.id+"icon";

var con=document.getElementById(iconid);

var error = this.getErrors(value)[0];

if (error != undefined) {

this.markInvalid(error);

  1. setValidIcon(con,this);
  2. return false;
  3. }
  4. this.clearInvalid();
  5. return true;
  6. }
  7. function setValidIcon(con,obj){
  8. if(con==null){
  9. var x0=0,y0=0;
  10. x0=(obj.x+obj.getWidth()-18)||(obj.getWidth()+85);
  11. y0=obj.y||0;
  12. if(obj.getXType()=="combo"||obj.getXType()=='treecombo'||obj.getXType()=="datefield"||obj.getXType()=="fileuploadfield"){
  13. var wid=document.getElementById(obj.id).style.width;
  14. wid=wid.substring(0,wid.length-2);
  15. x0=Number(wid);
  16. y0=0;
  17. }
  18. var parentNode=document.getElementById(obj.id).parentNode;
  19. var newChild=document.createElement("div");
  20. newChild.setAttribute("name","invalid-icon");
  21. newChild.setAttribute("id",obj.id+"icon");
  22. newChild.setAttribute("class","x-form-invalid-icon");
  23. newChild.setAttribute("className","x-form-invalid-icon");
  24. newChild.setAttribute("style","left:"+x0+"px; top:"+y0+"px; visibility: visible;z-index:10;");
  25. parentNode.appendChild(newChild);
  26. }
  27. }

网上也有一段重写validateValue的方法,笔者也是从那里借鉴过来的,表示感谢,但那段代码直接从本质上重写了:自己写代码判断文本框是否为空,是否满足Vtype设置,是否满足validator函数等,其中就漏掉了日期控件对日期格式的验证方法,好吧,我们就去extjs里面找这段方法吧(笔者有点傻,还真去找了,可惜没找到)。最后仔细看了extjs的validateValue方法,都调用了getErrors()方法,也就是说所有错误验证都在这个方法里面,而我们并不需要改写这个方法,只是增加一个验证提示,故修改为:

  1. var error = this.getErrors(value)[0];
  2. if (error != undefined) {
  3. this.markInvalid(error);
  4. setValidIcon(con,this);
  5. return false;
  6. }
  7. this.clearInvalid();
  8. return true;

其中setValidIcon(con,this)就是增加错误提示。最后效果如下:

  说明:笔者将红色感叹号设置在文本框范围内,从而不影响布局效果,使用getErrors之后,效果真完美,所有allowBlank,vtype,validator,maxValue,minValue,format等该验证的都验证了。

     下面就解决如果清除这个感叹号提示,一种方法是在validateValue里增加清除,比如:

  1. Ext.form.TextField.prototype.validateValue = function(value){
  2. var iconid=this.id+"icon";
  3. var con=document.getElementById(iconid);
  4. var error = this.getErrors(value)[0];
  5. if (error != undefined) {
  6. this.markInvalid(error);
  7. setValidIcon(con,this);
  8. return false;
  9. }
  10. if(Ext.get(iconid)){
  11. Ext.get(iconid).remove();//在这里清除
  12. }
  13. this.clearInvalid();
  14. return true;
  15. }

由于联系到笔者之前写的clearAll()函数,即当你需要清空一个文本框,并且清除错误提示,不可能还另外多写一句Ext.get(iconid).remove()吧?故笔者再重写clearInvalid方法:

  1. Ext.form.TextField.prototype.clearInvalid=function(){
  2. if (this.rendered && !this.preventMark) {
  3. this.el.removeClass(this.invalidClass);
  4. var mt = this.getMessageHandler();
  5. if(mt){
  6. mt.clear(this);
  7. }else if(this.msgTarget){
  8. this.el.removeClass(this.invalidClass);
  9. var t = Ext.getDom(this.msgTarget);
  10. if(t){
  11. t.innerHTML = '';
  12. t.style.display = 'none';
  13. }
  14. }
  15. var iconid=this.id+"icon";
  16. if(Ext.get(iconid)){
  17. Ext.get(iconid).remove();
  18. }
  19. }
  20. this.unsetActiveError();
  21. }

到此完整解决了我们需要的提示,最后添加一个函数,当保存时判断哪些文本框是验证错误的。

  1. function checkVtype(){
  2. var re=true;
  3. Ext.ComponentMgr.all.each(function(cmp){
  4. var Type=cmp.getXType();
  5. if(Type=='textfield'||Type=='combo'||Type=='treecombo'||Type=='datefield'||Type=='numberfield'||Type=='textarea'||Type=='timefield'||Type=='trigger'){
  6. if(cmp.isVisible()){
  7. var va=cmp.isValid();
  8. re=va?re:va;
  9. }
  10. }
  11. });
  12. if(re==false)
  13. Ext.MessageBox.show({title: '错误',msg: "您输入的信息验证错误,请核对后再执行该操作!<br/><span style='color:brown;'>错误原因:</span><span style='color:red;'>格式不正确或输入值为空。</span>",buttons: Ext.MessageBox.OK,icon: Ext.MessageBox.ERROR});
  14. return re;
  15. }

checkVtype()返回true,验证正确,返回false,验证错误。

原文地址:http://blog.csdn.net/kunoy/article/details/8007585

目录视图摘要视图订阅 基于Extjs开发不允许为空的文本框提示及相应的验证错误提示(转)的更多相关文章

  1. iOS 9应用开发教程之显示编辑文本标签文本框

    iOS 9应用开发教程之显示编辑文本标签文本框 ios9显示.编辑文本 在iOS,经常会看到一些文本的显示.文字就是这些不会说话的设备的嘴巴.通过这些文字,可以很清楚的指定这些设备要表达的信息.本节将 ...

  2. 基于QT的webkit与ExtJs开发CB/S结构的企业应用管理系统

      一:源起       1.何为CB/S的应用程序       C/S结构的应用程序,是客户端/服务端形式的应用程序,这种应用程序要在客户电脑上安装一个程序,客户使用这个程序与服务端通信,完成一定的 ...

  3. [转载]开发 Spring 自定义视图和视图解析器

    原文出处 http://www.ibm.com/developerworks/cn/java/j-lo-springview/ 概述 Spring 3.0 默认包含了多种视图和视图解析器,比如 JSP ...

  4. IOS开发之视图和视图控制器

    视图(View), 视图控制器(ViewController)是IOS开发UI部分比较重要的东西.在学习视图这一块的东西的时候,感觉和Java Swing中的Panel差不多.在UIKit框架中都有一 ...

  5. MVC 多级目录(控制器) 路由重写 及 多级Views目录 的寻找视图的规则

    转自:[原]Asp.net Mvc   多级控制器 路由重写 及 多级Views目录 的寻找视图的规则 asp.net mvc 为了更好的控制views的页面存放,和控制器的可读性,需要分开多级目录来 ...

  6. Cocos2d-x 坑之一:Xcode文件真实目录与工程视图目录

    Cocos2d-x一定要保证 Xcode文件真实目录与工程视图目录 的一致性,不然,会出现文件读取不了,或include不了的情况. 如果出现此类情况,优先查看真实目录的结构.

  7. SQL点滴17—使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识

    原文:SQL点滴17-使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识 在开发过程中会遇到需要弄清楚这个数据库什么时候建的,这个数据库中有多少表,这个存储过程长的什么样子等等信息 ...

  8. 基于Extjs+SpringMVC+MyBatis+Oracle的B/S信息系统简化开发思路

    要在上层简化就得有下层强大的架构作为支撑,通过采用企业级的各种框架,虽然学习成本高一些,但用好了效率也自然高. 数据层简化: 首先所有表都有名称为ID的主键字段.有与表同名的序列作为自增key. 数据 ...

  9. iOS 9应用开发教程之多行读写文本ios9文本视图

    iOS 9应用开发教程之多行读写文本ios9文本视图 多行读写文本——ios9文本视图 文本视图也是输入控件,与文本框不同的是,文本视图可以让用户输入多行,如图2.23所示.在此图中字符串“说点什么吧 ...

随机推荐

  1. 【笔记】js原生方法 在元素外部或内部实现添加元素功能(类似jq 的 insert 和 append)

    介绍的这个方法是:insetAdjacentHTML() 方法 此方法接收两个参数: 第一个参数必为下列值: beforebegin:在调用的元素外部的前面添加一个目标元素 afterend:在调用元 ...

  2. taglib.jsp

    <%@ taglib prefix="shiro" uri="/WEB-INF/tlds/shiros.tld" %><%@ taglib p ...

  3. spock spring 集成测试框架搭建心得

    转载:http://blog.csdn.net/hankle_xu/article/details/77531880 spock测试框架,使用groovy作为脚本语言,开发出的测试脚本具有优良的阅读性 ...

  4. Android笔记——UI开发

    概述: 布局(Layout)的概念是针对Activity的,Activity就是布满整个Android设备的窗体或者悬浮于其它窗体上的交互界面.在一个应用程序中通常由多个Activity构成.每一个须 ...

  5. C# socket 编程入门

    http://www.cnblogs.com/chenxizhang/archive/2011/09/10/2172994.html

  6. java 有用的类库

    import org.apache.commons.lang.StringUtils; 字符串库

  7. [转]SIGHUP与终端控制

    SIGHUP信号与控制终端   UNIX中进程组织结构为 session (会话)包含一个前台进程组及一个或多个后台进程组,一个进程组包含多个进程.一个session可能会有一个session首进程, ...

  8. 怎样使用CSS3实现书页(书本)卷角效果

    我们有时候想在页面显示一个公告或用户提示信息. 一个经常使用设计是使用书签形状. 我们能够给书签加入卷角效果.以使其更为逼真.所谓的"卷角"实际上能够用小角度倾斜的阴影效果来模拟. ...

  9. 读取properties属性文件——国际化

    public class PropertiesInfo { /** * PropertiesInfo实例 */ private static PropertiesInfo pi = null; pri ...

  10. Scrapy使用问题整理(转载)

    转载自:http://blog.csdn.net/heu07111121/article/details/50832999   最近尝试使用Scrapy进行数据抓取,并尝试在windows7 64位系 ...