• Jquery揭秘系列:Validation实现


             之前讲了一部分揭秘系列的东西,由于年初的时候在改项目,也没有写下去。现在开始闲下来了,会继续写没写完的东西,各种原生js实现Jquery的功能。

             转入正题,说一下今天要讲的东西。

             相信很多tx在项目里面写过这样的js代码:

             $("#..").click(function(){

                 var   val=$("#..").val();

                  if(!val)

                  {

                   alert('.......');

                   return    false;

                   }

                   if(!/...../.test(val))

                  {

                     alert('.......');     

                     return    false;

                  }

                ............各种验证

            });

           有没有觉得每次写的都是重复的东西,并且看起来不是很优雅,验证完全是可以写通用的。

           有的tx会说,我用的是Mvc的验证框架 ,只需要在后台代码的类的成员属性上面标记各种attribute,就能进行验证。这样确实是方便,但是不是很好控制。

           我觉得以下代码的写法看起来更直观,优雅:

           

     var objtest = {
                    rules: {
                        col1: {
                            required: true,
                            max: 99,
                            min: 10,
                            reg: /^a/gi,
                            remote: 'test.ashx'
                        },
                        col2: {
                            required: true
                        }
                    },
                    msg: {
                        col1: {
                            required: 'col1必填',
                            max: '最大不能超过99',
                            min: '最小不能小于10',
                            reg: '必须以a开头'
                        },
                        col2: {
                            required: 'col2必填'
    
                        }
                    }
    
                }
    
       $("#form").Validate(objtest);
    

            没错,这就是 validate框架里面的验证写法。

            讲到这个话题,你需要做一下功课,了解一下jquery.validate.js。我现在是要讲一下里面的实现原理:

           代码里面我只写了四个基本的验证:是否必填,最大值,最小值,正则匹配。

         

             这里我写一个简单的id选择器,同样是用$符号,看过我的博客的同学应该看到过。

              

      var $ = function () {
                    var arr = Array.prototype.slice.call(arguments);
                    return new $.prototype.Init(arr.length > 0 ? arr[0] : null);
                }

             下面继续扩展一些原型方法:

              $.prototype = {
                    Init: function (id) {
                        this.form = document.getElementById(id);
                        this.childs = this.form.childNodes;
                    },
                    Validate:function(){

                     这段代码单独拿出来。。。

                   }

               }

              Validate方法里面有个处理错误信息的div:

             

                       var that = this;
                        ///移除错误提醒的div
                        var removeDiv = function () {
                            var getErrdiv = document.getElementById('errmsg');
                            if (getErrdiv) {
                                that.form.removeChild(getErrdiv);
                            }
                        }
                        ///创建一个错误提醒的div
                        var creatDiv = function (msg, objset) {
                            var div = document.createElement('div');
                            div.style.backgroundColor = 'red';
                            div.id = 'errmsg';
                            div.innerHTML = msg;
                            that.form.appendChild(div);
                        }
                       
    

             然后就是   form   的onsubmit  事件:

           

                        this.form.onsubmit = function () {
                            var msg = "";
                            var checked = true;
                            removeDiv();
                            if (obj.rules) {
                                for (var i in obj.rules) {
                                    var col = obj.rules[i];
                                    ///必填验证
                                    if (col.required) {
                                        for (var m = 0; m < that.childs.length; m++) {
                                            if (that.childs[m].id == i && !that.childs[m].value) {
                                                msg = obj.msg[i].required;
                                                that.childs[m].focus();
                                                creatDiv(msg);
                                                return false;
                                            }
                                        }
    
                                    }
                                    ///最大值验证
                                    if (col.max) {
                                        for (var m = 0; m < that.childs.length; m++) {
                                            if (that.childs[m].id == i && that.childs[m].value > col.max) {
                                                msg = obj.msg[i].max;
                                                creatDiv(msg);
                                                that.childs[m].focus();
                                                return false;
                                            }
                                        }
    
                                    }
                                    ///最小值验证
                                    if (col.min) {
                                        for (var m = 0; m < that.childs.length; m++) {
                                            if (that.childs[m].id == i && that.childs[m].value < col.min) {
                                                msg = obj.msg[i].min;
                                                creatDiv(msg);
                                                that.childs[m].focus();
                                                return false;
                                            }
                                        }
    
                                    }
                                    ////正则匹配
                                    if (col.reg) {
                                        for (var m = 0; m < that.childs.length; m++) {
    
                                            if (that.childs[m].id == i && (!col.reg.test(that.childs[m].value))) {
    
                                                msg = obj.msg[i].reg;
                                                creatDiv(msg);
    
                                                that.childs[m].focus();
    
                                                return false;
                                            }
                                        }
                                    }
                              
                                }
    
                            }
                            return checked;
                        }
    

     这里面其实是用对象的属性对应控件的id ,然后分别做验证,只是把逻辑放在一块集中做了处理。

    完整代码   :

       var $ = function () {
                    var arr = Array.prototype.slice.call(arguments);
                    return new $.prototype.Init(arr.length > 0 ? arr[0] : null);
                }
                $.prototype = {
                    Init: function (id) {
                        this.form = document.getElementById(id);
                        this.childs = this.form.childNodes;
                    },
                    Validate: function (obj) {
                        var that = this;
                        ///移除错误提醒的div
                        var removeDiv = function () {
                            var getErrdiv = document.getElementById('errmsg');
                            if (getErrdiv) {
                                that.form.removeChild(getErrdiv);
                            }
                        }
                        ///创建一个错误提醒的div
                        var creatDiv = function (msg, objset) {
                            var div = document.createElement('div');
                            div.style.backgroundColor = 'red';
                            div.id = 'errmsg';
                            div.innerHTML = msg;
                            that.form.appendChild(div);
                        }
                       
                  
                        this.form.onsubmit = function () {
                            var msg = "";
                            var checked = true;
                            removeDiv();
                            if (obj.rules) {
                                for (var i in obj.rules) {
                                    var col = obj.rules[i];
                                    ///必填验证
                                    if (col.required) {
                                        for (var m = 0; m < that.childs.length; m++) {
                                            if (that.childs[m].id == i && !that.childs[m].value) {
                                                msg = obj.msg[i].required;
                                                that.childs[m].focus();
                                                creatDiv(msg);
                                                return false;
                                            }
                                        }
    
                                    }
                                    ///最大值验证
                                    if (col.max) {
                                        for (var m = 0; m < that.childs.length; m++) {
                                            if (that.childs[m].id == i && that.childs[m].value > col.max) {
                                                msg = obj.msg[i].max;
                                                creatDiv(msg);
                                                that.childs[m].focus();
                                                return false;
                                            }
                                        }
    
                                    }
                                    ///最小值验证
                                    if (col.min) {
                                        for (var m = 0; m < that.childs.length; m++) {
                                            if (that.childs[m].id == i && that.childs[m].value < col.min) {
                                                msg = obj.msg[i].min;
                                                creatDiv(msg);
                                                that.childs[m].focus();
                                                return false;
                                            }
                                        }
    
                                    }
                                    ////正则匹配
                                    if (col.reg) {
                                        for (var m = 0; m < that.childs.length; m++) {
    
                                            if (that.childs[m].id == i && (!col.reg.test(that.childs[m].value))) {
    
                                                msg = obj.msg[i].reg;
                                                creatDiv(msg);
    
                                                that.childs[m].focus();
    
                                                return false;
                                            }
                                        }
                                    }
                              
                                }
    
                            }
                            return checked;
                        }
                    }
                }
    
                $.prototype.Init.prototype = $.prototype;

               代码看着没啥难度,比较简单 。

              调用方法如下  :

             

      <form id="test">
            <input id="col1" type="text" />
            <input id="col2" type="text" />
            <input id="Submit1" type="submit" value="submit" />
        </form>
    window.onload=function(){
    
    
      var objtest = {
                    rules: {
                        col1: {
                            required: true,
                            max: 99,
                            min: 10,
                            reg: /^a/gi,
                            remote: 'test.ashx'
                        },
                        col2: {
                            required: true
    
                        }
                    },
                    msg: {
                        col1: {
                            required: 'col1必填',
                            max: '最大不能超过99',
                            min: '最小不能小于10',
                            reg: '必须以a开头'
                        },
                        col2: {
                            required: 'col2必填'
    
                        }
                    }
    
                }
    
                $("test").Validate(objtest);
    
    
    
    
    
    
    
    
    }

    代码可以继续优化,添加各种验证方法。这里只是抛砖引玉。有啥意见或者疑问可以联系:QQ546558309,或者留言。

    下一节会讲ajax的原生js实现。

           

            

  • 相关阅读:
    Mysql 之导入导出
    Go gin之文件上传
    记录Go gin集成发送邮件接口的坑
    关于mysql某个用户无法登陆的情况
    面向对象程序设计的分析基本步骤
    提示框判断事件
    事件响应的公共方法
    IComparable<T>.CompareTo(T) 方法
    浏览器缓存机制
    PHP中include和require
  • 原文地址:https://www.cnblogs.com/a546558309/p/3627925.html
Copyright © 2020-2023  润新知