form表单校验插件(含详细注解)

说到表单校验,第一个想起来的肯定是jquery的validate.js,该插件的确是很强大,用在项目中也很健壮,但是为什么我选择重新自己封装一个插件呢?

为什么要自己封装表单验证插件:

1、因为项目中用到的是sea.js,需要对插件进行封装,而楼主不知如何封装validate.js,和其连带的其他插件;
2、因为项目中不是所有的校验都是通过插件校验的,也要自己手动校验一部分,表单提交时不知如何提交;
3、插件功能越多,就意味着越大…

封装的表单验证如何调用?

1、引入jquery.min.js,因为表单中的语法不是原生的,是基于jquery的,因此引入jquery时必备的;
2、引入我们的插件form.js;
3、html中通过标签引用,例如<input type="text" name="phone" flag="false" id="phone" placeholder="请输入您的手机号" check="required isMobile" />,其中id是必须的,check中的内容是你需要校验的项,flag="false"是是否通过校验的标识,接下来,我将进行详细讲解。

form.js插件代码详解?

(function ($) {
    $.fn.extend({
        "checkForm": function (options) {
            var flag = true;//标志每一个输入框中所有检验规则是否执行
            var root = this; //当前应用对象存入root
            var pwd; //密码存储
            var defaults = {
                // 提示信息
                tip_success: '<img src="../../xstatic/ximages/zhengque.png" />', //验证成功提示
                loginname: {   //html中的标签的id值
                    remote: "<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>用户登录名已存在",  //验证后的错误提示
                    required : "<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>用户名不能为空",
                    rangelength:"<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>用户名长度只能在 6-15位字符之间",
                    stringCheck:"<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>只能包括英文字母、数字和下划线 ",
                    reg_rangelength:/^[a-zA-Z0-9]{6,15}$/,   //对应的正则校验
                    reg_stringCheck:/^[a-zA-Z][a-zA-Z0-9_]*$/
                },
                username: {
                    required : "<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>姓名不能为空",
                    rangelength : "<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>姓名长度只能在2-20位字符之间",
                    isChineseChar : "<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>姓名必须为汉字",
                    reg_rangelength:/^[\u4e00-\u9fa5]{2,10}$/,
                    reg_isChineseChar:/^[\u4E00-\u9FA5]+$/,
                },
                company: {
                    required : "<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>公司/企业名称不能为空"
                },
                yzm: {
                    remote: "<img src='../../xstatic/ximages/cuowu.png ' style='margin-right: 8px;'>验证码不正确",
                    required : "<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>验证码不能为空"
                },
                phone: {
                    required : "<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>手机号不能为空",
                    isMobile : "<img src='../../xstatic/ximages/cuowu.png ' style='margin-right: 8px;'>手机号码格式有误,请输入正确的手机号",
                    remote : "<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>手机号已注册,继续注册请与原账号解绑",
                    reg_isMobile:/^13[0-9]{1}[0-9]{8}$|14[0-9]{1}[0-9]{8}$|15[0-9]{1}[0-9]{8}$|17[0-9]{1}[0-9]{8}$|18[0-9]{1}[0-9]{8}$/
                },
                inviteid: {
                    remote: "<img src='../../xstatic/ximages/cuowu.png ' style='margin-right: 8px;'>邀请码录入不正确",
                    checkFigure:"<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>只能含有数字",
                    reg_checkFigure:/^\d+$/
                },
                confirmPassword: {
                    required : "<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>请再次输入密码",
                    equalTo:"<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>两次输入密码不一致"
                },
                plainPassword: {
                    required : "<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>请输入密码",
                    rangelength:"<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>密码长度只能在 6-15位字符之间",
                    stringCheck:"<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>只能包括英文字母、数字和下划线",
                    reg_rangelength:/^[a-zA-Z0-9]{6,15}$/,
                    reg_stringCheck:/^[a-zA-Z0-9_]*$/
                },
                place: {
                    rangelength : "<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>职位长度只能在2-15位字符之间",
                    reg_rangelength:/^[a-zA-Z0-9]{2,15}$/,
                },
                email: {
                    required : "<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>邮箱不能为空",
                    stringCheck:"<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>请输入正确的邮箱格式",
                    reg_stringCheck:/^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/
                },
                address: {
                    rangelength : "<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>地址长度只能在4-50位字符之间",
                    reg_rangelength:/^[a-zA-Z0-9]{4,50}$/,
                },
                businmark: {
                    required : "<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>营业执照注册号不能为空"
                },
                myfiles:{
                    required : "<img src='../../xstatic/ximages/tishi.png ' style='margin-right: 8px;'>请上传营业执照"

                }
            };

            if (options) {        //如果不为空就合并参数
                $.extend(defaults, options)
            }

            // 文本框失去焦点时验证
            $(":text,:password,textarea", root).each(function () {
                $(this).blur(function () {
                    var _validate = $(this).attr("check");
                    if (_validate) {  //如果输入框需要校验,则执行check()方法
                        check($(this), _validate, $(this).val());
                    }
                })
            });
            // 验证方法
            var check = function (obj, _match, _val) {
                //obj为对应的需要校验的输入框
                //match为html中check属性的属性值
                //val为输入框的值
                var id=obj.attr("id");//这里是为了取到对应的元素的校验值defaults[id]
                var value=$.trim(_val);//防止空格
                var arr = _match.split(" ");//校验项字符串转为数组
                for(var i=0;i<arr.length;i++){
                    if(flag==true){  //flag控制是否进行下一项的校验,因此html中check="required isMobile"中的校验项有顺序,需要自己控制
                        switch (arr[i]) {   //arr[i]为校验项
                            case 'required':
                                flag=value ? showMsg(obj, defaults.tip_success, true) : showMsg(obj, defaults[id].required, false);
                                //校验必须字段,及时的更改flag状态,校验成功返回true,失败返回false,成功之后才会进行下一项的校验,失败,直接提示失败文案
                                break;//执行到此,case语句不再往下执行
                            case 'rangelength':
                                if(!value){  //针对非必填项,没有required的校验,所以一定要判断一下value是否为空,空的时候不执行以下的校验项,因为该项可为空
                                    break;
                                }else{
                                    flag=chk(value, defaults[id].reg_rangelength) ? showMsg(obj, defaults.tip_success, true) : showMsg(obj, defaults[id].rangelength, false);
                                    break;
                                }
                            case 'stringCheck':
                                if(!value){
                                    break;
                                }else{
                                    flag=chk(value, defaults[id].reg_stringCheck) ? showMsg(obj, defaults.tip_success, true) : showMsg(obj, defaults[id].stringCheck, false);
                                    break;
                                }
                            case 'pw1':  //该校验项应为password的最后一项校验
                                flag="true";//flag标识
                                pwd = value;  //实时储存
                                var confirmValue=$("#confirmPassword").val();  //确认密码
                                if(value==confirmValue){  //以下校验是为了防止密码和确认密码一致后,再去改动密码,而确认密码不会提示的问题
                                    $("#confirmPassword").attr("flag","true");//当两者一致时,标记确认密码校验通过
                                    showMsg($("#confirmPassword"), defaults.tip_success, true);
                                }else if(value!=confirmValue&&confirmValue){
                                    $("#confirmPassword").attr("flag","false");//当两者不一致时,标记确认密码校验不通过
                                    showMsg($("#confirmPassword"),defaults.confirmPassword.stringCheck, false);
                                }
                                break;
                            case 'pw2'://该校验项应为confirmPassword的最后一项校验
                                if(!value){
                                    break;
                                }else{
                                    flag=pwdEqual(value, pwd) ? showMsg(obj, defaults.tip_success, true) : showMsg(obj, defaults[id].equalTo, false);
                                    break;
                                }
                            case 'isChineseChar':
                                if(!value){
                                    break;
                                }else{
                                    flag=chk(value, defaults[id].reg_isChineseChar) ? showMsg(obj, defaults.tip_success, true) : showMsg(obj, defaults[id].isChineseChar, false);
                                    break;
                                }
                            case 'isMobile':
                                if(!value){
                                    break;
                                }else{
                                    flag=chk(value, defaults[id].reg_isMobile) ? showMsg(obj, defaults.tip_success, true) : showMsg(obj, defaults[id].isMobile, false);
                                    break;
                                }
                            case 'checkFigure':
                                if(!value){
                                    break;
                                }else{
                                    flag=chk(value, defaults[id].reg_checkFigure) ? showMsg(obj, defaults.tip_success, true) : showMsg(obj, defaults[id].checkFigure, false);
                                    break;
                                }
                                defaults:
                                    return true;
                        }
                    }else{  //flag==false时,一定校验不通过,
                        obj.attr("flag",false);
                    }
                    if(i==arr.length-1){  //当校验到最后一项时,需要将flag表示置为true,否则其他校验无法进入
                        //以下是需要调用接口才可验证的项,按照自己需求可就行改造
                        if(flag==true&&id=="phone"){  //校验手机号是否已注册
                            $.ajax({
                                type: "post",
                                async: false,
                                url: "http://www.baidu.com/register/checkPhone",
                                data: {phone: value},
                                dataType: "text",
                                success: function (data) {
                                    if(data=="false"){
                                        showMsg(obj, defaults[id].remote, false);
                                        flag=false;
                                        $(".send-yzm").css("color","rgba(0,0,0,.3)");
                                    }else{  //手机号校验成功
                                        $(".send-yzm").css("color","#313131");
                                    }
                                }
                            });
                        }
                        if(flag==true&&id=="yzm"){  //校验验证码是否正确
                            var phone=$("#phone").val();
                            $.ajax({
                                type: "post",
                                async: false,
                                url: "http://www.baidu.com/register/checkRandom",
                                data: {yzm: value,phone:phone},
                                dataType: "text",
                                success: function (data) {
                                    if(data=="false"){
                                        showMsg(obj, defaults[id].remote, false);
                                        flag=false;
                                    }
                                }
                            });
                        }
                        if(flag==true&&id=="loginname"){  //校验验证码是否正确
                            if(value){
                                $.ajax({
                                    type: "post",
                                    async: false,
                                    url: "http://www.baidu.com/register/checkLoginName",
                                    data: {loginname: value},
                                    dataType: "text",
                                    success: function (data) {
                                        if(data=="false"){
                                            showMsg(obj, defaults[id].remote, false);
                                            flag=false;
                                        }
                                    }
                                });
                            }else{
                                $(obj).next(".errormsg").remove();
                            }

                        }
                        if(flag==true&&id=="inviteid"){  //校验验证码是否正确
                            if(value){
                                $.ajax({
                                    type: "post",
                                    async: false,
                                    url: "http://www.baidu.com/register/checkInvite",
                                    data: {inviteid: value},
                                    dataType: "text",
                                    success: function (data) {
                                        if(data=="false"){
                                            showMsg(obj, defaults[id].remote, false);
                                            flag=false;
                                        }
                                    }
                                });
                            }else{
                                $(obj).next(".errormsg").remove();
                            }
                        }
                        obj.attr("flag",flag);//当前校验项是否通过由flag进行控制
                        flag=true;//全局flag复位
                    }
                }

            };

            //判断两次密码是否一致
            var pwdEqual = function (val1, val2) {
                return val1 == val2 ? true : false;
            };

            //正则验证
            var chk = function (str, reg) {
                return reg.test(str);
            };

            //显示信息
            var showMsg = function (obj, msg, mark) {//文字显示的位置在此处控制
                var id=obj.attr("id");
                if(id=="phone"&&mark==false){
                    $(".send-yzm").css("color","rgba(0,0,0,.3)");
                }
                $(obj).next(".errormsg").remove();
                var _html = "<span class='errormsg' style='font-size:14px;color:#ff3c00;margin-left:10px; '>" + msg + "</span>";
                if(id=="yzm"){
                    $(obj).next().next(".errormsg").remove();
                    $(obj).next().after(_html);
                }else{
                    $(obj).after(_html);
                }
                return mark;
            }

        }
    })
})(jQuery);

总结:代码注释的很是详细,相信大家看完之后就会明白其原理,简单明了,可操作性强。但是仍然有几个地方需要提醒大家注意:

  1. <form action="http://baidu.com" method="post" flag="true">form表单需要指定flag标记,true表示表单可提交,false表示表单不可提,这是为了方便大家重写submit方法,可在方法中添加自己需要控制的东西,要是有插件不能校验的校验项,可通过判断form的flag是否为true,true的话再去判断,false的话直接提示插件校验结果。
  2. <form action="http://baidu.com" method="post" flag="true">默认的flag应为true,因为submit方法没有写在插件中,所以点击提交的时候需要我们去校验是否为空,因为插件中的事件都是在失去焦点时触发的,因此一旦输入框触发了失去焦点事件,插件一定做了校验,所以没有做检验的一定为空,提交方法如下:
function _onSubmit() {
        $(":text,:password", $(".content-warp")).each(function () {
            var flag=$(this).attr("flag");
            //判断每个输入框的是否通过校验
            var id=$(this).attr("id");
            var value=$.trim($(this).val());
            if(flag=="false"){   //如果没有进行填选
            //一旦有一个未flase,form表单不可提交
                $(".form1").attr("flag","false");      if(id!="loginname"&&id!="inviteid"&&id!="registerYZM"){
                //这个为过滤掉不必填项
  if(!value){
       $(this).next(".errormsg").remove();
       var _html = "<span class='errormsg' style='font-size:14px;color:#ff3c00;margin-left:10px; '>" + defaults[id].required + "</span>";
if(id=="yzm"){                             $(this).next().next(".errormsg").remove();
       $(this).next().after(_html);
     }else{
         $(this).after(_html);
     }
       }
    }
}
});
}

.
3. <input type="text" name="phone" flag="false" id="phone" placeholder="请输入您的手机号" check="required isMobile" />每一个校验项默认的flag应该为false,等校验成功后将该项flag置为true,
4. 最后提醒一句,一旦涉及到表单提交,最好写一个防止重复提交的方法,因为这是一个好的习惯。

jQuery formValidator表单验证插件,它是基于jQuery类库,实现了js脚本于页面html代码的分离。你可以划分多个校验组,每个组的校验都是互不影响。对一个表单对象,你只需要写一行代码就可以轻松实现无数种脚本控制。jQuery formValidator表单插件致力于改善重复编程、考虑浏览器兼容性等情况;你只关心业务逻辑,而无需关心实现过程,只需简单的配置,无需写代码就能实现表单的检验。 jQuery formValidator表单校验插件 4.1.0 升级内容: 新增以下功能: 1、新增换肤功能,包括提示层的样式、输入控件(目前只支持text、password、file、textarea)的样式。initConfig增加theme属性,表示皮肤名,theme的值可取目录theme下的文件夹名。详见电子版帮助文件里的【制作皮肤】 2、formvalidator函数增加属性leftTrim和rightTrim。是否去掉左边或右边的空格,默认值false 3、ajaxValidator的success事件,可以返回字符串,表示错误信息,将显示在提示层上。 4、为initConfig增加属性ajaxForm,用于配置整个表单ajax提交的参数,详见demo7和api帮助 $.formValidator.initConfig({theme:"Default",submitOnce:true,formID:"form1",ajaxForm:{ dataType : "html", buttons:$("#button"), url: "http://www.51gh.net/chkuser.aspx?act=ok" }}); 5、所有函数的onError和onSuccess支持字符串,也支持函数(参数为当前的值)返回字符串。 6、发布网页版代码生成器,从当前版本开始支持。 解决以下BUG: 1、修正ajaxValidator函数有一处条件书写错误的BUG。 2、修正formvalidator函数autoModify属性对password控件不起作用的BUG。 调用步骤: a、在你要校验表单页面中引入代码生成器的脚本。 b、调用函数。如果已经写了校验代码,请在校验代码注册完成后调用。 $.formValidatorTools.openTools(); 压缩包相关变更 1、所有的帮助、范例制作成了chm电子帮助文件 2、插件相关的文件放一个目录里 插件支持5种大的校验方式,分别是:inputValidator(针对input、textarea、select控件的字符长度、值范围、选择个数的控制)、compareva lidator(提供2个对象的比较,目前可以比较字符串和数值型)、ajaxValidator(通过ajax到服务器上做数据校验)、regexValidator(提供可扩展的正则表达式库) 、functionValidator (可使用外部函数来做校验,可以当做过程处理)。插件支持四种提示模式:固定提示层(FixTip)、自动构建提示层(AutoTip)、单个提示层跟随(SingleTip)、弹出提示内容(AlertTip)。插件支持换肤:默认情况下提供4套皮肤,其中包括58网、网易邮箱注册两套皮肤。 本插件于其他校验控件最大的区别有6点: 1、校验功能可以扩展。    对中文、英文、数字、整数、实数、Email地址格式、基于HTTP协议的网址格式、电话号码格式、手机号码格式、货币格式、邮政编码、身份证号码、QQ号码、日期等等这些控制,别的表单校验控件是代码里写死的,而formValidator是通过外部js文件来扩展的,你可以通过写正则表达式和函数来无限的扩展这些功能。 2、实现了校验代码于html代码的完全分离。    你的所有信息都无需配置在校验表单元素上,你只要在js上配置你的信息。使美工(界面)和JavaScript工程师的工作不交织在一起 3、你只需写一行代码就能完成一个表单元素的所有校验。你只需要写一行代码就能完成一下所有的控制 •支持所有类型客户端控件的校验 •支持jQuery所有的选择器语法,只要控件有唯一ID和type属性 •支持函数和正则表达式的扩展。提供扩展库formValidatorReg.js,你可以自由的添加、修改里面的内容。 •支持2种校验模式。第一种:文字提示(showword模式);第二种:弹出窗口提示(showalert模式) •支持多个校验组。如果一个页面有多个提交按钮,分别做不同得提交,提交前要做不同的校验,所以你得用到校验组的功能。 •支持4种状态的信息提示功能,可以
本人自己开发的jquery表单验证控件! 使用方便,样式美观,完全开源。好不好用了就知道了! 插件名称:jquery表单验证插件 V1.0 插件作者:zy8008 最后更新:2011-4-28 插件说明: datatype类型说明: --------------------------------------- *:必填写,可为任意字符 number:数字 zip:邮政编码 mobile:手机号 email:邮箱 ajax:异步远程验证,必须添加ajaxurl属性并将要验证的字段保留空 如: reg:正则验证,必须添加reg属性 如: checkbox:复选框验证 radiobox:单选框验证 前台添加属性说明: ----------------------------------------------- datatype:必须 数据验证类型,见上面说明 errmsg:可选 错误信息,验证失败的信息,如果不设置或为空,则验证框显示“验证失败!” tip:可选 未验证前的提示信息,如果不设置或为空,则隐藏提示框 allowblank:可选 值为“true|false”默认为true 是否允许为空,如果设为true则值为空的时候也能通过验证,对*,ajax,checkbox,radiobox,reg无效 reg: 正则表达式规则,只能用开datatype为reg的时候,否则无效 ajaxurl:异步远程验证url,只能用的datatype为ajax的时候,否则无效。将要验证的字段放在url最后,将留空 如test.asp?uname= 调用说明: ------------------------------------------------- $(document).ready(function() { $("#aspnetForm").valideform({isokhide:true,btnsubmit:"#bbb"})}); #aspnetForm:需要验证的表单的ID,你也可以用jquery选择器自已定义 isokhid:可选 值为“true|false”默认为false 当点击提交按钮的时候,如果通过验证的项目将隐藏验证提示框 btnsubmit:可选 指定一个绑定提交事件的控件ID,如一个普通按钮或一个超链接,表单中的submit依然有效 其它具体使用方法,请参阅demo文件!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值