自定义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的滚动新闻列表
Jun 19 Javascript
JS 面向对象之神奇的prototype
Feb 26 Javascript
js获取php变量的实现代码
Aug 10 Javascript
jQuery选择器源码解读(四):tokenize方法的Expr.preFilter
Mar 31 Javascript
jquery ui resize 中border-box的bug修正
Apr 26 Javascript
JavaScript中的Math.LOG2E属性使用详解
Jun 14 Javascript
BootStrap扔进Django里的方法详解
May 13 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
Mar 24 jQuery
Vue axios设置访问基础路径方法
Sep 19 Javascript
vue控制多行文字展开收起的实现示例
Oct 11 Javascript
浅谈Vue.use到底是什么鬼
Jan 21 Javascript
Vue快速实现通用表单验证的方法
Feb 24 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 基础函数
2017/02/10 PHP
php readfile()修改文件上传大小设置
2017/08/11 PHP
PHP将整数数字转换为罗马数字实例分享
2019/03/17 PHP
js 获取(接收)地址栏参数值的方法
2013/04/01 Javascript
javaScript arguments 对象使用介绍
2013/10/18 Javascript
JQuery获取与设置HTML元素的内容或文本的实现代码
2014/06/20 Javascript
jquery根据锚点offset值实现动画切换
2014/09/11 Javascript
iframe中子父类窗口调用JS的方法及注意事项
2015/08/25 Javascript
微信小程序(三):网络请求
2017/01/13 Javascript
性能优化之代码优化页面加载速度
2017/03/01 Javascript
详细讲解vue2+vuex+axios
2017/05/27 Javascript
vue单页开发父子组件传值思路详解
2018/05/18 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
2018/08/24 Javascript
浅谈ng-zorro使用心得
2018/12/03 Javascript
详解在微信小程序的JS脚本中使用Promise来优化函数处理
2019/03/06 Javascript
微信小程序实现吸顶特效
2020/01/08 Javascript
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
JavaScript函数重载操作实例浅析
2020/05/02 Javascript
[05:48]DOTA2英雄梦之声vol21 屠夫
2014/06/20 DOTA
简单介绍Python中的filter和lambda函数的使用
2015/04/07 Python
Python爬虫之模拟知乎登录的方法教程
2017/05/25 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
2018/02/08 Python
对python中各个response的使用说明
2020/03/28 Python
python实现学生管理系统开发
2020/07/24 Python
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
韩国流行时尚女装网站:Dintchina(中文)
2018/07/19 全球购物
茱莉蔻美国官网:Jurlique美国
2020/11/24 全球购物
大学自我鉴定
2013/12/20 职场文书
大学毕业感言50字
2014/02/07 职场文书
卖车协议书
2014/04/21 职场文书
教师读书活动总结
2014/05/07 职场文书
英语专业求职信
2014/07/08 职场文书
离职信范本
2015/06/23 职场文书
2016入党培训心得体会范文
2016/01/08 职场文书
如何把新闻人物写得立体、鲜活?
2019/08/14 职场文书
python神经网络编程之手写数字识别
2021/05/08 Python