自定义javascript验证框架示例【附源码下载】


Posted in Javascript onMay 31, 2019

本文实例讲述了自定义javascript验证框架。分享给大家供大家参考,具体如下:

看过 jquery 验证框架,在使用的时候,其实还是很晕的,很麻烦,使用的时候代码也不简洁,因此才有了弄一个自己的jquery验证框架的计划,基本原理就是对 input ,select, textarea 这三类控件做校验,在里面定义自定义属性作为检验。 另外采用js 做i18n 国际化,通过cookies 中的语言,调用不同的js 语言包, 对于自己开发项目来说,足够用了,而且,还可以灵活扩展。个人用应该不错。

为了测试这个验证框架,其实静态html 页面足够了,但习惯问题,自己搭建了一个简单的 动态web  工程,后面会给出源代码下载

自定义javascript验证框架示例【附源码下载】

1. 验证框架主要采用 jquery异步对象去扩展的,也就是jquery defered 的用法,这样去做验证的好处是,即使某些验证是采用ajax 方式去验证的,结合jquery when 函数,一样可以批量校验. 主要代码如下:

function Validator(errorHandle){
  this.errorHandle = errorHandle;
  this.elements = ["input","select","textarea"];
}
Validator.prototype = {
    contructor : Validator,
    rules : {},
    addRules : function(ruleName, validFunction, errorFunction){
      this.rules[ruleName] = {
          validFunction : validFunction,
          errorFunction : errorFunction
      };
    },
    eventFunction : function(item){
      var self = this;
      $(item).die().live("blur", function(){
        self.validateItem(item);  
      });
    },
    bindingEvent : function(divId){
      var self = this;
      self.elements.forEach(function(element){
        $("#" + divId).find(element).each(function(i, item){
          self.eventFunction(item);    
        });
      });
    },
    validateDiv : function(divId){
      var dtdList = [],
        self = this;
        self.elements.forEach(function(element){
          $("#" + divId).find(element).each(function(i, item){
            dtdList.push( self.validateItem(item) );
          });          
        });
        self.elements.forEach(function(element){
          if ($("#" + divId).find(element).length == 0){
            var deferred = $.Deferred();
            deferred.resolve();
            dtdList.push(deferred);
          }        
        });
      return $.when.apply(null, dtdList).fail(function(){
        if(self.errorHandle) {
          self.errorHandle.call(null, divId);          
        }
      });
    },
    validateItem : function(d){
      var self = this;
      var ruleList = [];
      for(var r in this.rules){  
        if( $(d).is("[" + r + "]") ){
          ruleList.push(r);
        }
      }
      var dtd = $.Deferred();
      var checked = function(){  
        if ( ruleList.length >= 1 ){
          var ok = self.validate(d, ruleList[0]);
          ok.done(function(){
            if(ruleList.length >= 2){
              self.validate(d, ruleList[1]);
            }
            ruleList.shift();
            checked();
          }).fail(function(){
            dtd.reject();
          });
        } else {
          dtd.resolve();
        } ;
        //dtd.resolve();
        //return dtd;
      };
      checked();
      return dtd;
    },
    validate : function(d, rule){
      var value = $(d).val(),
        attributeValue = $(d).attr(rule),
        f = this.rules[rule].validFunction,
        self = this;      
      var ok = f.call(null, d, value, attributeValue);
      return ok.fail(function(item){
        if($(item).siblings("[validationError]").length != 0 ){
          $(item).siblings("[validationError]").remove();              
        }
        if(self.rules[rule].errorFunction){
          self.rules[rule].errorFunction(d, rule);
        }else {
          self.showErrorMessage(d, rule);          
        }
      }).done(function(item){
        if($(item).siblings("[validationError]").length != 0 ){
          $(item).siblings("[validationError]").remove();              
        }
      });
    },
    validationByRegx : function(d, value, regx){
      var dtd = $.Deferred(),
      ok = regx.test(value);
      if(ok || $.trim(value) === ""){
        dtd.resolve(d);
      } else {
        dtd.reject(d);
      }
      return dtd.promise();
    },
    /*默认的出错处理方法*/
    showErrorMessage : function(item,rule){
      var msgInfo = getJSLocale( $(item).attr("msgid") );
      var ruleInfo = getJSLocale( "msg_" + rule );
      if($(item).siblings("span").find("[msgid='msg_"+ rule +"']").length == 0){
        var message = msgInfo || ruleInfo;
        $(item).parent().append("<span validationError><label msgid='msg_" + rule +"'>" + message + "</label></span>");        
      }
    }
};
//add default rule
Validator.prototype.addRules("required", function(d, value, attributeValue){
  var dtd = $.Deferred();
  var ok = !($.trim(value) == "" || value == null);
  if(ok){
    dtd.resolve(d);
  } else {
    dtd.reject(d);
  }
  return dtd.promise();
});
Validator.prototype.addRules("maxLen", function(d, value, attributeValue){
  var dtd = $.Deferred();
  var ok = (value.length <= attributeValue);
  if(ok){
    dtd.resolve(d);
  } else {
    dtd.reject(d, attributeValue);
  }
  return dtd.promise();
}, function(d, rule){
  if($(d).siblings("span").find("[msgid='msg_" + rule + "']").length == 0){
    var attributeValue = $(d).attr(rule);
    var msgInfo = getJSLocale( $(d).attr("msgid"), {length:attributeValue} );
    var ruleInfo = getJSLocale( "msg_" + rule, {length:attributeValue} );
    var message = msgInfo || ruleInfo;
    $(d).parent().append("<span validationError><label msgid='msg_" + rule + "' errorMsgParam='"+attributeValue+"'>" + message + "</label></span>");        
  }
});
Validator.prototype.addRules("minLen", function(d, value, attributeValue){
  var dtd = $.Deferred();
  var ok = (value.length >= attributeValue);
  if(ok){
    dtd.resolve(d);
  } else {
    dtd.reject(d, attributeValue);
  }
  return dtd.promise();
}, function(d, rule){
  if($(d).siblings("span").find("[msgid='msg_" + rule + "']").length == 0){
    var attributeValue = $(d).attr(rule);
    var msgInfo = getJSLocale( $(d).attr("msgid"), {length:attributeValue} );
    var ruleInfo = getJSLocale( "msg_" + rule, {length:attributeValue} );
    var message = msgInfo || ruleInfo;
    $(d).parent().append("<span validationError><label msgid='msg_" + rule + "' errorMsgParam='"+attributeValue+"'>" + message + "</label></span>");        
  }
});
Validator.prototype.addRules("url", function(d, value, attributeValue){
  return Validator.prototype.validationByRegx(d, value, /^(((ht|f)tp(s?))\:\/\/)[a-zA-Z0-9]+\.[a-zA-Z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/i);
});
Validator.prototype.addRules("email", function(d, value, attributeValue){  
  return Validator.prototype.validationByRegx(d, value, /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/);
});
Validator.prototype.addRules("english", function(d, value, attributeValue){  
  return Validator.prototype.validationByRegx(d, value, /^[a-zA-Z0-9_\-]+$/);
});

对于html 页面的验证方式呢,采用如下方式:

<div><h1>自定义验证框架测试</h1></div>
  <div>
    <div id="required_valid_div">
      <input type="text" required minLen="3" maxLen="5"/>  <p />
      english:<input type="text" required english maxLen="50"/>  <p />
      <input type="text" required maxLen="50"/>  <p />
      <input type="text" url required />  <p />
      email: <input type="text" email />  <p />
      <select required>
        <option value="">请选择</option>
        <option value="1">中国</option>
      </select>
      <p />
      <textarea required maxLeng="500"></textarea> <p />
      自定义错误信息:<input type="text" url required msgid="myUrlError"/>  <p />
    </div>
    <button onclick="javascript:validatorDiv();">验证</button>
    <button onclick="javascript:loadI18nCN();">Load 中文国际化</button>
    <button onclick="javascript:loadI18NEN();">Load English i18N</button>
  </div>

其中有很多自定义的属性,比如required,maxLen, url,email 等。 当然部分与HTML5的有冲突,也不矛盾。如果不想冲突,当然可以另外定义,但要注意validation.js 要同步修改,还有i18n 国际化文件. 在这里面我自定义了一个 自定义错误信息,如果有msgid 属性的会去找msgid 对应的国际化消息,否则会去找rule_加上自定义属性的消息. 这是为了自己的项目定制的。

js 国际化的支持

var JSLocale = {
  msg_required: "不能为空",
  msg_maxLen: "最大长度{{:length}}.",
  msg_minLen: "最小长度{{:length}}.",
  msg_url: "不合法的网址",
  msg_email: "Email 不合法",
  msg_english : "只允许输入 0-9,a-z, A-Z",
  myUrlError: "自定义错误提示:url 不合法哦",
  end: ""
};

测试效果

自定义javascript验证框架示例【附源码下载】

附:完整实例代码点击此处本站下载

Javascript 相关文章推荐
jquery实现居中弹出层代码
Aug 25 Javascript
setInterval,setTimeout与jquery混用的问题
Apr 08 Javascript
javascrip关于继承的小例子
May 10 Javascript
js获取判断上传文件后缀名的示例代码
Feb 19 Javascript
jQuery实现统计复选框选中数量
Nov 24 Javascript
layer弹出层中H5播放器全屏出错的解决方法
Feb 21 Javascript
mui上拉加载功能实例详解
Apr 13 Javascript
vue中element-ui表格缩略图悬浮放大功能的实例代码
Jun 26 Javascript
浅谈Vue数据响应
Nov 05 Javascript
Vue动画事件详解及过渡动画实例
Feb 09 Javascript
webpack项目使用eslint建立代码规范实现
May 16 Javascript
JS实现点击掉落特效
Jan 29 Javascript
vue spa应用中的路由缓存问题与解决方案
May 31 #Javascript
JS实现处理时间,年月日,星期的公共方法示例
May 31 #Javascript
一文了解vue-router之hash模式和history模式
May 31 #Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
May 31 #Javascript
微信小程序环境下将文件上传到OSS的方法步骤
May 31 #Javascript
Vue Router history模式的配置方法及其原理
May 30 #Javascript
vue-cli3+ts+webpack实现多入口多出口功能
May 30 #Javascript
You might like
支持中文字母数字、自定义字体php验证码代码
2012/02/27 PHP
thinkphp3.0 模板中函数的使用
2012/11/13 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
2014/04/08 PHP
PHP实现动态柱状图改进版
2015/03/30 PHP
PHP中array_keys和array_unique函数源码的分析
2016/02/26 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
Event altKey,ctrlKey,shiftKey属性解析
2013/12/18 Javascript
AngularJS iframe跨域打开内容时报错误的解决办法
2015/01/26 Javascript
javascript使用shift+click实现选择和反选checkbox的方法
2015/05/04 Javascript
分享一个插件实现水珠自动下落效果
2016/06/01 Javascript
checkbox:click事件触发span元素内容改变的方法
2017/09/11 Javascript
Vue官方文档梳理之全局配置
2017/11/22 Javascript
微信小程序简单实现form表单获取输入数据功能示例
2017/11/30 Javascript
JS中用EL表达式获取上下文参数值的方法
2018/03/28 Javascript
vue-router beforeEach跳转路由验证用户登录状态
2018/12/26 Javascript
nodejs实现用户登录路由功能
2019/05/22 NodeJs
[01:03:33]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python 随机数使用方法,推导以及字符串,双色球小程序实例
2017/09/12 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
Django实现单用户登录的方法示例
2019/03/28 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
Win系统PyQt5安装和使用教程
2019/12/25 Python
Numpy之reshape()使用详解
2019/12/26 Python
Python tkinter 下拉日历控件代码
2020/03/04 Python
Python通过zookeeper实现分布式服务代码解析
2020/07/22 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
基于ccs3的timeline时间线实现方法
2020/04/30 HTML / CSS
英国设计的甲板鞋和船鞋:Chatham
2018/12/06 全球购物
SQL中where和having的区别
2012/06/17 面试题
大学生四年生活自我鉴定
2013/11/21 职场文书
学校班子个人对照检查材料思想汇报
2014/09/27 职场文书
机关作风整顿个人整改措施思想汇报
2014/09/29 职场文书
干部作风建设心得体会
2014/10/22 职场文书
2015年信贷员工作总结
2015/04/28 职场文书
人代会简报
2015/07/21 职场文书
Spring boot应用启动后首次访问很慢的解决方案
2021/06/23 Java/Android