JavaScript练习四之简易表单验证

 写该组件主要是为了练习正则表达式。以针对大部分日常工作上遇到的验证情况添加了多种校验规则,尚未做兼容性处理(┬_┬)

使用方式
 1、首先于页面中引入js文件<script type="text/javascript" src="formValidate.js"></script>
 2、在页面将校验规则直接与元素进行绑定完成快速校验,方法为<td><input name="number"  class="form_control" '''rule="require;number"'''></td>, 该方法可以使利用内置方式或者自定义方式进行验证。
 3、在简单的绑定完参数之后,可使用一些组件提供的一些内置校验规则完成校验,使用$('form[name="testForm"]').formValid()即可完成验证。
 4、上述方式只能完成一些简单的逻辑校验,如要实现逻辑较为复杂的校验,可使用如下方法,对要验证的表单进行整体的参数设置 ,所有参数配置都不是必须项,所以开发的时候可以根据所需进行取舍。 
  (1)rule:参数为自定义规则,可完成逻辑较为复杂的验证。
  (2)fields:对页面元素进行规则绑定。
  (3)valid:校验完成之后的相应事件。
                $('form[name="testForm"]').formValid({
                        rule   : {
                            'fun1' : function(param){
                            //此处添加自定义校验规则...
                            //返回值true为验证通过,false或者string都为验证失败
                            },
                            'fun2'   : function(param) {
                            //此处添加自定义校验规则...
                            //返回值true为验证通过,false或者string都为验证失败
                            },
                        },
                        fields : {
                             //此处与页面中元素进行绑定,详细校验规则在后续会添加
                        'field1' : 'number', //字段1类型为校验规则为数字
                        'field2' : 'fun1', //字段2使用上述的自定义校验规则1
                        'field3' : 'fun2', //字段3使用上述的自定义校验规则2
                        'field4' : 'number;range[-100~100]',//范围为-100~100的数值
                        'field5' : 'cn;length[~200]',//校验规则为汉字,且汉字长度不得超过200
                        },
                        valid : function(form){
                        //此处为校验成功之后的响应事件
                        alert('表单1验证成功');
                 }
              });


   4、在写好rule自定义规则后,可直接与页面的元素进行绑定。如果存在多个校验,校验优先级为直接绑定<参数配置绑定。如果存在多个同名规则,则校验
   优先级为内置规则<自定义规则,如果同时存在action和valid相应规则,则form中的action参数跳转将失效(这方面可做优化)

 
//@charset "utf-8";
 /**
 * function : 表单验证
 * author   : yinggaozhen
 * create   : 2015-07-28
 * version  : 0.1.8
 */
 (function($, undefined) {
     var GN = 'YingGaoZhen';
     var _isCheck = false;
     var ruleArry;
     isString = function(s) {
         return typeof s === 'string';
     }
     isFunction = function(f) {
          return typeof f === 'function';
     }
     
     function _initValidArray() {
          ruleArry = {
               'require' : [/^\S+$/, "请输入必须值"],
               'number'  : [/^\-?\d*$/, "请输入数字"],
               'tel'     : [/^(?:(?:0\d{2,3}[\- ]?[1-9]\d{6,7})|(?:[48]00[\- ]?[1-9]\d{6}))$/, "电话格式不正确"],
               'mobile'  : [/^1[3-9]\d{9}$/, "手机号格式不正确"],
               'email'   : [/^[\w\+\-]+(\.[\w\+\-]+)*@[a-z\d\-]+(\.[a-z\d\-]+)*\.([a-z]{2,4})$/i, "请输入正确的邮箱"],
               'date'    : [/^\d{4}-\d{1,2}-\d{1,2}$/, "请输入正确日期"],
               'url'     : [/^(https?|ftp):\/\/[^\s]+$/i, "网址格式不正确"],
               'english' : [/^\w*$/, "请输入正确的英文"],
            'cn'        : [/^[\u0391-\uFFE5]+$/, "请输入中文"],
               'stock'   : [/^(((002|000|300|600)[\d]{3})|60[\d]{4})$/, "请输入正确的股票代码"],
          }
     }
     
     $.fn['formValid'] = function(options) {
          _initValidArray();
          new formValid(this, options);
          return this;
     }
     
     function formValid(element, options) {
          var me = this;
          me.$el = element;
          me._init(options);
     }
     
     formValid.prototype = {
          _init : function(options) {
               var me = this;
               me._setOption(options);
               me._checkRule();
               me.$el.on('click' , 'input,textarea', {el : me}, me._focusIn)
                      .on('focusout','input,textarea', {el : me}, me._focusOut)
                      .on('submit',{el : me}, me._submit);
          },
          _validate : function(fieldVal,rule) {
               if (rule[0].test(fieldVal)) {
                    return true;
               } else {
                    return rule[1];
               }
          },
          _checkRule : function() {
               var me = this,
                   fields = me._getField();
               $form = me.$el;
               me._isAjaxSubmit = true;
               me._errorFields = new Array();
               $.each(fields, function(field, rule){
                    var fieldVal = $form.find('*[name="'+field+'"]').val();
                    var ret = me._getRule(fieldVal, rule);
                    if(true !== ret) {
                         me._isAjaxSubmit = false;
                         if('boolean' === typeof ret) ret = '';
                         me._addErrorFields(field, ret);
                    }
               });
          },
          _getRule : function(fieldVal, rule) {
               var me = this,
                   validRet = false,
                   rules,
                   tRe;
               if (isString(rule)) {
                    validRet = true;
                    rules = rule.split(';');
                    $.each(rules, function(ruleIndex, ruleValue){
                         tRet = me._getCustomRule(fieldVal, ruleValue);
                         if(null === tRet){
                              if(typeof ruleArry[ruleValue] !== 'undefined') {
                                   tRet = me._validate(fieldVal, ruleArry[ruleValue]);
                              } else {
                                   tRet = me._changeRule(fieldVal, ruleValue);
                              }
                         }
                         validRet = tRet === true ? true : tRet;
                         if (true !== validRet) {
                              return false;
                         }
                    })
               }
               return validRet;
          },
          _changeRule : function(fieldVal, rule) {
               var me  = this,
                    ret = fieldVal,
                    filterRet = false;
               if(-1 !== rule.indexOf('range')) {
                    filterRet  = me._filterShell(fieldVal, 'range', rule);
               } else if (-1 !== rule.indexOf('length')) {
                    filterRet  = me._filterShell(fieldVal, 'length', rule);
               }
               return filterRet;
          },
          _addErrorFields : function(fields, errorMsg){
               var errorField = {fields:fields,errorMsg:errorMsg};
               this._errorFields.push(errorField);
          },
          _filterShell : function(fieldVal, ruleType, rule) {
               var shellReg = /(?:\[)(\-?\d*\~\-?\d*)(?:\])/;
               var range = shellReg.exec(rule)[1].split('~'),
                    ret = false,
                    v = fieldVal,
                    a,
                    b;
               a = range[0];
               b = range[1];
               switch(ruleType){
               case 'range' :
                    v = +v;
                    break;
               case 'length' :
                    v = v.length;
               default:
                    break;
               }
               if (a && b && v >= a && v <= b) {
                    ret = true;
               } else if (!a && b && v <= +b){
                    ret = true;
               } else if (a && !b && v >= +a) {
                    ret = true
               } else {
                    ret = '请输入指定范围的数值';
               }
               return ret;
          },
          _blurInputTips : function($input) {
               var me = this,
                    name = $input[0].name,
                    inputType = $input.attr('type'),
                    spanClass;
               var inputInfo = me._getInputState($input);
               $spanClass = $input.next('span');
               if (inputType != 'submit') {
                    if (inputInfo.state == -1) {
                         $input.removeClass('success').addClass('error');
                         if(undefined !== $spanClass.html()) {
                              $spanClass.removeClass('reg-span-success').addClass('reg-span-error');
                              $spanClass.html(inputInfo.msg);
                         } else {
                              $input.after('<span for="'+name+'" ermsg class="reg-span-error">'+inputInfo.msg+'</span>');
                         }
                    } else if (inputInfo.state == 0) {
                         $input.removeClass('error').addClass('success');
                         if(undefined !== $spanClass.html()) {
                              $spanClass.removeClass('reg-span-error').addClass('reg-span-success');
                              $spanClass.html('<img src="sucess.png">');
                         } else {
                              $input.after('<span for="'+name+'" ermsg class="reg-span-success"><img src="sucess.png"></span>');
                         }
                    }
               }
          },
          _showErrorTips : function() {
               var me = this,
                    $form = me.$el,
                    $input,
                    inputList,
                    inputInfo;
               inputList = $form.find('input');
               $.each(inputList, function(pi, pv) {
                    $input = $(pv);
                    me._blurInputTips($input);
               });
          },
          _getInputState : function($input) {
               var me = this,
                    ef = this._errorFields,
                    ret = {
                         msg : '',
                         state : 0
                    },
                    fields,
                    name = $input[0]['name'];
               
               fields = me._getField();
               $.each(ef, function(efi, efv) {
                    if (efv.fields == name) {
                         msg = efv.errorMsg;
                         ret.msg = msg;
                         ret.state = -1;
                    }
               })
               if (undefined == fields[name]) {
                    ret.state = -2;
               }
               return ret;
          },
          _getErrorFields : function() {
               return this._errorFields;
          },
          _setOption : function(options) {
               if ('undefined' === typeof options.fields) {
                    options.fields = {};
               }
               this._options = options;
          },
          _getField : function() {
               var me = this;
               $inputList = me.$el.find('[rule]');
               $.each($inputList, function(ipi, ipv){
                    var name = $(ipv).attr('name'),
                         rule = $(ipv).attr('rule');
                         if (undefined === me._options.fields[name]) {
                              me._options.fields[name] = rule;
                         }
               });
               return me._options.fields;
          },
          _getCustomRule : function(fieldVal, cusRule) {
               var cusRuleFunc,
                   ret = null;
               if('undefined' !== typeof this._options.rule && 'undefined' !== typeof this._options.rule[cusRule]) {
                    cusRuleFunc = this._options.rule[cusRule];
                    if(isFunction(cusRuleFunc)){
                        ret = cusRuleFunc(fieldVal);
                        ret = undefined === ret ? true : ret;
                    }
               }
               return ret;
          },
          _focusIn : function(e) {
               var el = e.data.el,
                    $input = $(this),
                    inputInfo;
               el._checkRule();
               el._blurInputTips($input);
          },
          _focusOut : function(e) {
               var el = e.data.el,
                    $input = $(this),
                    inputInfo;
               el._checkRule();
               el._blurInputTips($input);
          },
          _submit : function(e) {
               var me = e.data.el,
                   form = e.target,
                    isSubmit;
               
               me._checkRule();
               isSubmit = me._isAjaxSubmit;
               e.preventDefault();
               if (true === isSubmit && 'function' === typeof me._options.valid) {
                    me._options.valid(me.$el);
               } else if(true === isSubmit && 'undefined' === typeof me._options.valid) {
                    form.submit();
               } else {
                    me._showErrorTips();
               }
          },
     }
 }(jQuery));



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值