`
magicxin
  • 浏览: 16861 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Javascript前台简单验证插件2

阅读更多
前面的easyFormValidateWithJquery.js是基于 Jquery的,是我在工作中的第一个验证插件,使用起来比较灵活的。但是不足之处也显而易见,除了细节方面的诸多不足,最大的不足就是在于是干扰表单式的,所以一定要对表单的元素属性进行修改,这就在可重用性、维护性等方面造成了不便,这毕竟是把双刃剑,灵活的同时污染了表单。

其实在工作中很快我就写了第二个验证插件,这次是无干扰式的,而且是基于Dom的Javascript,不需要Jquery库支持。下面就附上代码。

//easyFormValidate2.0

//easyFormValidateWithDom.js

//本验证方法基本能满足简单的验证需求,如不能为空,必须是日期,必须是整数,最大值,最小值等

//本验证方法验证模式有2种:焦点离开文本域即验证和手动调用验证方法

//本验证方法失败信息显示方式有2种:alert提示信息+元素焦点;添加错误样式+元素焦点

//本验证方法是属于无干扰式的验证方法,只需要初始化验证信息即可。

//本验证方法最大缺点是由于是基于json的,并且使用了大量的对象for each语句,所以在大量元素验证的性能方面可能或有不如意的地方,

//但是完全可以胜任中小型的表单验证。
var SimpleValidate ={
    validates:{
        quick:{
        },
        normal:{}
    },
    elements:{
    },
    elmt:{
        id:"1",
        rule:[],
        messages:[]
    },
    init:function(objs){
        for(var obj in objs){
            this.addToValidates(objs[obj]);
        }
    },
    addToValidates:function(obj){
        if(!obj)return;
        var checkType = obj.checkType;
        if(checkType=='quick'){
            var eles = obj.eles;
            this.addToElements(eles);
            //if checkType is quick,add their focusout event;
            this.addOnFocusOutEvent(eles);
        }else if(checkType=='normal'){
            var eles = obj.eles;
            this.addToElements(eles);
            //if checkType is normal,just do nothing except add elements.And when invoking the validate method,
            //each elements in  this.elements will be validated.
        }
    },
    //initializaing the elements,add new elements to this.elements,give those elements their dom reference property;
    addToElements:function(eles){
        for(var id in eles){
            var info = eles[id];
            info.domEle = this.tools.getEle(id);
            info.id = info.id||id;
            this.elements[id]=info;
        }
    },
    addOnFocusOutEvent:function(eles){
        for(var f in eles){
            var nScope = this;
            nScope.elements[f].domEle.onfocusout=function(){
                var ret = nScope.validateDomEle(this);
            }
        }
    },
    initMessage:function(myEle,rule){
        var methodName = "";
        for(var method in rule){
            methodName = method.match(/\w+/)==null?method:method.match(/\w+/)[0];
            if(methodName==''||this.rules.methods[methodName.toLowerCase()]==null||rule[method]=='')
            continue;
            var messages = myEle.messages;
            if(!messages){
                messages = {};
                myEle.messages=messages;
            }
            messages[methodName]=rule[method];
        }
    },
    validateRule:function(elmt,rule,param){
        var    result = this.rules.methods[rule.toLowerCase()].call(this,elmt,param);
        if(!result){
            var retMsg;
            if(!this.elements[elmt.id]||!this.elements[elmt.id].messages)return this.messages[rule.toLowerCase()];
            return this.elements[elmt.id].messages[rule.toLowerCase()]||this.messages[rule.toLowerCase()];
        }
    },
    messages:{
        "fill":"该输入项不能为空",
        "date":"日期格式错误,必须为形如2001-01-01格式",
        "email":"邮箱格式错误,必须为形如pdcss_gs@126.com格式",
        "integer":"该输入项必须是非负整数",
        "minlength":"最小长度没有符合要求",
        "maxlength":"最大长度没有符合要求",
        "rangelength":"长度范围没有符合要求",
        "doctype":"不是有效的word类型",
        "maxvalue":"最大值没有符合要求",
        "minvalue":"最小值没有符合要求"
    },
    rules:{
        methods:{
            "fill":function(elmt){
                return /\S/.test(elmt.value);
            },
            "date":function(elmt){
                return /\d{4}-\d{2}-\d{2}/.test(elmt.value);
            },
            "email":function(elmt){
                return /\w+@\w+\.\w+/.test(elmt.value);
            },
            "integer":function(elmt){
                return /^\d*$/.test(elmt.value);
            },
            "minlength":function(elmt,param){
                param = this.rules.parameters(param);
                return this.tools.getLength(elmt.value)>=param[0];
            },
            "maxlength":function(elmt,param){
                param = this.rules.parameters(param);
                return this.tools.getLength(elmt.value)<=param[0];
            },
            "rangelength":function(elmt,param){
                param = this.rules.parameters(param);
                return this.tools.getLength(elmt.value)>=param[0]&&this.tools.getLength(elmt.value)<=param[1];
            },
            "doctype":function(elmt){
                return /.+\.doc$/.test(elmt.value);
            },
            "maxvalue":function(elmt,param){
                param = this.rules.parameters(param);
                return elmt.value<=param[0];
            },
            "minvalue":function(elmt,param){
                return elmt.value>=param[0];
            },
            "regex":function(elmt,param){
                if(param.charAt(0)!='('||param.charAt(param.length-1)!=')')return false;
                param = param.substring(1,param.length-2);
                return new RegExp(param).test(elmt.value);
            }
        },
        parameters:    function(param){
            var re = /[\(]?\s*(\w*)\s*[\s,\)]/g;
            var arr="";
            var retArray=[];
            while ((arr = re.exec(param)) != null){
                   retArray.push(arr[1]);
               }
               return retArray;
        }
    },
    tools:{
        getLength:function(val){
        var len = 0;
        var ch;
        if(val==null)
            return len;
        for(var i = 0; i<val.length;i=i+1){
            ch=val.charCodeAt(i);
            if(ch>255)
                len+=2;
            else
                len=len+1;
        }
        return len;
        },
        convertToObj:function(rules,msgs){
            var ruleArr = rules.split(";");
            var msgArr = msgs.split(";");
            var r={};
            for(var i=0;i<ruleArr.length;i=i+1){
                r[ruleArr[i]]=msgArr[i]==null?"":msgArr[i];
            }
            return r;
        },
        convertArrayToObj:function(rules,msgs){
            var r={};
            for(var i=0;i<rules.length;i=i+1){
                r[rules[i]]=msgs[i]==null?"":msgs[i];
            }
            return r;
        },
        getFormByFormIndex:function(formIndex){
            var retForm = document.getElementById(formIndex)||document.all(formIndex);
            if(retForm&&retForm.length){
                retForm = retForm[0];
            }
            return retForm;
        },
        getEle:function(eleIndex){
            var retEle = document.getElementById(eleIndex)||document.all(eleIndex);
            if(retEle&&retEle.length){
                retEle =  retEle[0];
            }
            return retEle;
        },
        getObjPropertyNum:function(obj){
            var num =0;
            for(var p in obj)num=num+1;
            return num;
        }
    },
    validate:function(){
        var notError = true;
        var elemts = this.elements;
        for(var ele in elemts){
            var myEle = elemts[ele];
            var retMsg = this.validateMyEle(myEle);
            if(retMsg){
                this.addErrMsg(myEle,retMsg);
                myEle.domEle.focus();
                return false;
            }else this.removeErrMsg(myEle);
        }
        return notError;
    },
    validateDomEle:function(domEle){
        var myEle = this.elements[domEle.id||domEle.name];
        if(!myEle)return;
        var retMsg = this.validateMyEle(myEle);
        if(retMsg){
            this.addErrMsg(myEle,retMsg);
            return false;
        }else this.removeErrMsg(myEle);
    },
    addErrMsg:function(myEle,retMsg){
        var eTypes = myEle.errorType;
        var domEle = myEle.domEle;
        if(!eTypes)return;
        for(var i=0;i<eTypes.length;i=i+1){
            var etype = eTypes[i];
            if(etype=='alert'){
                alert(retMsg);
            }else if(etype=='page'){
                var cName = domEle.className;
                if(cName.indexOf("wrongClass")==-1){
                    domEle.className=domEle.className+" wrongClass";
                    domEle.title = retMsg;
                }
            }
        }
    },
    removeErrMsg:function(myEle){
        var eTypes = myEle.errorType;
        var domEle = myEle.domEle;
        if(!eTypes)return;
        for(var i=0;i<eTypes.length;i=i+1){
            var etype = eTypes[i];
            if(etype=='page'){
                var cName = domEle.className;
                if(cName.indexOf("wrongClass")!=-1){
                    domEle.className = cName.replace("wrongClass","");
                    domEle.title = "";
                }
            }
        }
    },
    validateMyEle:function(myEle){
        if(!myEle)return;
        var rule = myEle.rule;
        var msg = myEle.message;
        var domEle = myEle.domEle;
        if(!domEle)return;
        var rule = this.tools.convertArrayToObj(rule,msg);
        var methodName;
        var param;
        this.initMessage(myEle,rule);
        for(var method in rule){
            methodName = method.match(/\w+/)==null?method:method.match(/\w+/)[0];
            if(methodName==null||methodName==''||this.rules.methods[methodName.toLowerCase()]==null)
                continue;
            param = method.match(/\([\w,\s]*\)/)==null?"":method.match(/\([\w,\s]*\)/)[0];
            if(methodName=='regex'){
                param = method.substring(5);
            }
            var ret =this.validateRule(domEle,methodName,param);
            if(ret!=null&&ret!='undefined'){
                //formElement.focus();
                return ret;
            }
        }
    }
};



demo:

<html>
<head>
<script src="js/easyFormValidateWithDom.js" type="text/javascript"></script>
<script type="text/javascript">
function validate(){
    if(!SimpleValidate.validate())return;
}
function init(){
    SimpleValidate.init({
        "validateA":{
            checkType:"normal",//离开焦点即验证(quick);调用方法验证(normal)
            eles:{
                "inputC":{rule:["fill","integer"],message:["inputC不能为空"],errorType:["alert"]},
                "inputD":{rule:["fill","regex(/\w*?hello\w*?/g)"],message:["inputD不能为空","输入项必须含有hello"],errorType:["alert"]}
            }
        },
        "validateB":{
            checkType:"quick",//离开焦点即验证(quick);调用方法验证(normal)
            eles:{
                "inputA":{rule:["fill","maxlength(3 ,4)"],message:["inputA不能为空","inputA最大长度为3"],errorType:["alert","page"]}
            }
        }
    });
}
</script>
<style type='text/css'>
.wrongClass{ border: 1px dotted red; }
</style>
</head>
<body onload='init()'>
<form id='testForm'>
A:<input type=text value='need validate' id='inputA'><br>
B:<input type=text value='need not validate' id='inputB'><br>
C:<input type=text value='need validate' id='inputC'><br>
D:<input type=text value='custom regex validate' id='inputD'>
<input type=button value='Validate' onclick='validate()'>
</form>
</body>
</html>
1
2
分享到:
评论

相关推荐

    JavaScript数据验证

    用纯JavaScript写的一款一款支持前台input,文本框的验证插件

    超好用的验证框架 封装js

    很好用的前台验证控制输入的框架 个人写的 不好请见谅!

    结合SpringMVC和Hibernate-validator,自动生成前台的js验证代码.docx

    。。。

    结合SpringMVC和Hibernate-validator,自动生成前台的js验证代码.pdf

    。。。

    jQuery-1.7.2任意文件读取漏洞验证利用脚本

    jQuery是一个快速、简洁的JavaScript框架,丰富的Javascript代码库,在其1.7.2版本的sys_dia_data_down模块存在任意文件读取漏洞,攻击者可通过前台读取任意文件。

    JAVA医院挂号系统毕业设计源码+选题介绍+功能需求+技术要求分析等内容

    (1) 登录功能:通过前台验证用户密码,验证成功后可以登录。 (2) 医生信息管理:具体包括医生信息进行维护。 (3) 患者信息管理:对患者信息进行维护。 (4) 科室信息管理:对医生所在科室进行维护。 (5) ...

    GoodProject Maven Webapp.zip

    jQuery EasyUI是基于JQuery的一个前台ui界面的插件,功能相对没extjs强大,但页面也是相当好看的,同时页面支持各种themes以满足使用者对于页面不同风格的喜好。一些功能也足够开发者使用,相对于extjs更轻量。 ...

    精通JS脚本之ExtJS框架.part2.rar

    第2章 JavaScript浏览器对象模型与事件处理 2.1 浏览器对象模型 2.1.1 文档对象 2.1.2 表单及其元素对象 2.1.3 浏览器信息对象 2.1.4 窗口对象 2.1.5 网址对象 2.1.6 历史记录对象 2.2 基本事件处理 2.3 2...

    精通JS脚本之ExtJS框架.part1.rar

    第2章 JavaScript浏览器对象模型与事件处理 2.1 浏览器对象模型 2.1.1 文档对象 2.1.2 表单及其元素对象 2.1.3 浏览器信息对象 2.1.4 窗口对象 2.1.5 网址对象 2.1.6 历史记录对象 2.2 基本事件处理 2.3 2...

    [计算机毕设]基于jsp的项目报告格式化系统设计与实现-后台模块系统设计与实现(源代码+项目报告).zip

    采用JSP作为后台开发语言,HTML和JavaScript作为前台开发语言,MYSQL5.0作为后台数据库,系统具有稳定性高、可移植性强等特点。 本系统中文档数据的传输和存储均使用XML形式,以XML作为数据的中间状态,便于以后进行...

    asp.net知识库

    .NET的插件机制的简单实现 我对J2EE和.NET的一点理解 难分难舍的DSO(一) InternalsVisibleToAttribute,友元程序集访问属性 Essential .NET 读书笔记 [第一部分] NET FrameWork的Collections支持 .NET的反射在软件...

    多多校园论坛,很经典很强大

    2、使用多多留言本及插件,可以制作成为一个具有个性的个人小站,方法是用留言本作为后台发布,首页调用为网站栏目显示,快速显示页为文章显示及列表(在官方网站有下载); 3、也可用于内部留言本、会员系统、个人...

    osCommerce 3.0.2.zip

    osCommerce具有易于操作的可视化安装界面、完善的前台商品展示和户在线购物车功能、强大的后台管理,还有运行速度快,国外很受推崇。官方并没有提供中文语言包,只能靠国内的一个组织汉化,可定制性相对差。 ...

    style:Spring+SpringMVC +HibernateJPA

    style一、框架使用:1、后台框架:使用spring+spring mvc+hibernate jpa。2、前台框架:使用bootstrap V2。二、主要内容(持续更新。。。):1、对spring data jpa做二次封装...5、前台验证框架jquery.validate的使用。

    asoft签到管理系统tykq3.5_build20110125

    2、验证机制cookies化 3、界面UI更换 [2009-1-7] v 3.0 PACK3 [本次Pack3的发布主要是bug修正、少许的功能升级,并为下一个版本做铺垫。主要升级如下:] 1、 修改后台系统设置的“每日进行当日签到统计时间”...

    从入门到精通HTML5——PDF——网盘链接

     11.3 无插件范式 223  11.4 HTML 5的新特性 224  11.5 小结 224  第12章 HTML 5与HTML 4的区别 225  视频讲解:51分钟  12.1 语法的改变 226  12.1.1 HTML 5的语法变化 226  12.1.2 HTML 5中的标记方法 226...

    ExtAspNet_v2.3.2_dll

    -增加示例(iframe/parent_postback_run3.aspx),如何通过简单的Javascript代码回发父页面(feedback:eroach)。 -修正一些书写错误(feedback:bmck)。 -从Region控件中删除SplitColor属性,增加CollapseMode, ...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -增加示例(iframe/parent_postback_run3.aspx),如何通过简单的Javascript代码回发父页面(feedback:eroach)。 -修正一些书写错误(feedback:bmck)。 -从Region控件中删除SplitColor属性,增加CollapseMode, ...

Global site tag (gtag.js) - Google Analytics