smallerpig

最近准备把公司开发的CMS的表单添加中增加客户端的表单验证,之前一直是使用的ASP.NET自带的服务器验证控件,其用起来固然方便,但却无形中也给服务器带来了压力。

 

(function ($) {
     var FormValidator = function () {
         this.regexEnum = {
             idCard: /^[1-9]([0-9]{14}|[0-9]{16})([0-9]|X)$/,
             num: /^\-?([1-9]\d*)$/,         //数字
             email: /^([0-9A-Za-z\-_\.]+)@([0-9a-z]+\.[a-z]{2,3}(\.[a-z]{2})?)$/,
             phone: /^1[3|4|5|8]\d{9}$/
         };
         this.validatorArr = {};
     };
    
     FormValidator.prototype.init = function () {
         var scope = this;
         $(\'.formValidate\').each(function () {
             var el = $(this);
             scope.initItem(el);
         }); //each
     };
    
     FormValidator.prototype.initItem = function (el) {
         var scope = this;
         var cfg = el.attr(\'data-cfg\');
    
         if (cfg && cfg.length > 0) {
             cfg = eval(\'(\' + cfg + \')\');
             //            cfg = JSON.parse(cfg);
             var check = cfg.check || true,
                 id = el.attr(\'id\') || new Date().getTime(),
                 initMsg = cfg.initMsg || \'请填入信息\',
                 sucMsg = cfg.sucMsg || \'格式正确\',
                 errorMsg = cfg.errorMsg || \'请注意格式\',
                 type = cfg.type || \'\',
                 requred = cfg.requred || false,
                 msgPosition = cfg.msgPosition || \'right\';
    
             cfg.id = id;
             cfg.initMsg = initMsg;
             cfg.sucMsg = sucMsg;
             cfg.errorMsg = errorMsg;
             cfg.type = type;
             cfg.msgPosition = msgPosition;
             cfg.requred = requred;
             cfg.requredMsg = cfg.requredMsg || \'该项必填\';
    
             if (check) {
                 var tips = $(\'<div class="validateTips validateInit" id="\' + id + \'Tips"><div class="triangle_icon"><div class="before"></div><div class="after"></div></div>\' + initMsg + \'</div>\');
                 //                var tips = $(\'<div class="validateTips validateInit" id="\' + id + \'Tips">\' + initMsg + \'</div>\');
                 var offset = el.offset();
                 var height = parseInt(el.outerHeight());
                 var width = parseInt(el.outerWidth());
                 var l = offset.left;
                 var t = offset.top;
                 if (msgPosition == \'bottom\') {
                     tips.addClass(\'posBottom\');
                     t += height + 4;
                 } else if (msgPosition == \'right\') {
                     tips.addClass(\'posRight\');
                     l += width + 6;
                 } else if (msgPosition == \'top\') {
                     tips.addClass(\'posTop\');
                     t += height * ( -1) - 8;
                 }
    
                 tips.css({ left: l, top: t });
                 $(\'body\').append(tips);
                 cfg.el = el;
                 cfg.tipEl = tips;
    
                 el.focus(function () {
                     scope.funcValidate(el, cfg);
                 });
                 el.blur(function () {
                     scope.funcValidate(el, cfg);
                 });
                 el.keyup(function () {
                     scope.funcValidate(el, cfg);
                 });
                 el.keydown(function () {
                     scope.funcValidate(el, cfg);
                 });
                 cfg.validate = function () {
                     scope.funcValidate(el, cfg);
                 };
                 scope.validatorArr[id] = cfg; //生成相关验证对象
             }
    
         } else {
             console.log(\'请输入完整验证信息!否则控件会产生错误!\');
         }
     };
    
     FormValidator.prototype.funcValidate = function (el, cfg) {
         var id = cfg.id;
    
         //取消事件不执行下面逻辑
         if (!this.validatorArr[id])
             return false;
    
         var type = cfg.type;
         var requred = cfg.requred;
         if (!type && !this.regexEnum[type]) {
             return false;
         }
         var isPass = 0; //0初始状态,1成功,-1错误
         var msg = \'\';
         var r = this.regexEnum[type] ? this.regexEnum[type] : type;
    
         if (requred && el.val() == \'\') {
             isPass = -1;
             msg = cfg.requredMsg;
         } else {
             if (el.val() == \'\') {
                 isPass = 0;
                 msg = cfg.initMsg;
             } else {
                 if (r.test(el.val())) {
                     isPass = 1;
                     msg = cfg.sucMsg;
                 } else {
                     isPass = -1;
                     msg = cfg.errorMsg;
                 }
             }
         }
         if (isPass == 0) {
             this.validatorArr[id][\'tipEl\'].removeClass(\'validateError\');
             this.validatorArr[id][\'tipEl\'].removeClass(\'validateSuc\');
             this.validatorArr[id][\'tipEl\'].addClass(\'validateInit\');
             this.validatorArr[id][\'tipEl\'].html(\'<div class="triangle_icon"><div class="before"></div><div class="after"></div></div>\' + msg);
         } else if (isPass == 1) {
             this.validatorArr[id][\'state\'] = \'success\';
             this.validatorArr[id][\'tipEl\'].removeClass(\'validateError\');
             this.validatorArr[id][\'tipEl\'].removeClass(\'validateInit\');
             this.validatorArr[id][\'tipEl\'].addClass(\'validateSuc\');
             this.validatorArr[id][\'tipEl\'].html(\'<div class="triangle_icon"><div class="before"></div><div class="after"></div></div>\' + msg);
         } else if (isPass == -1) {
             this.validatorArr[id][\'state\'] = \'error\';
             this.validatorArr[id][\'tipEl\'].removeClass(\'validateSuc\');
             this.validatorArr[id][\'tipEl\'].removeClass(\'validateInit\');
             this.validatorArr[id][\'tipEl\'].addClass(\'validateError\');
             this.validatorArr[id][\'tipEl\'].html(\'<div class="triangle_icon"><div class="before"></div><div class="after"></div></div>\' + msg);
         }
     };
    
     FormValidator.prototype.validatorAll = function () {
         for (var k in this.validatorArr) {
             var v = this.validatorArr[k];
             v.validate();
         }
     };
    
     FormValidator.prototype.removeValidator = function (id) {
         if (id && this.validatorArr[id]) {
             //        this.validatorArr[id].tipEl
             this.validatorArr[id].tipEl.remove(); //删除提示信息
             delete this.validatorArr[id]; //删除该验证项目
             //        this.validatorArr[id].el.unbind();//移除所有事件,但是考虑标签可能会有其他事件,此处暂时不予处理
             var s = \'\';
         }
     };
    
     FormValidator.prototype.addValidator = function (id) {
         var el = $(\'#\' + id);
         this.initItem(el);
     };
    
     FormValidator.prototype.validatorState = function () {
         for (var k in this.validatorArr) {
             var v = this.validatorArr[k];
             if (v.state == \'error\') {
                 return false;
             }
         }
         return true;
     };
     window.FormValidator = FormValidator;
 })(jQuery);
   
View Code

配合html代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <style type="text/css">
        .form div { height: 30px; line-height: 30px; margin: 5px; }
        .validateTips { min-width: 100px; border-radius: 2px; padding: 5px 10px; z-index: 500; position: absolute; font-size: 12px; }
        .validateInit { background: #FFFFE0; border: 1px solid #F7CE39; }
        .validateError { background: orange; border: 1px solid red; }
        .validateSuc { background: #79D62D; border: 1px solid Green; }
        .triangle_icon { position: absolute; }
        .triangle_icon div { border-style: solid; border-width: 6px; position: absolute; }
          
        /*上边提示*/
        .posTop .triangle_icon { width: 12px; height: 12px; bottom: -12px; }
        .posTop .triangle_icon .after { bottom: 1px; }
        .posTop .triangle_icon .after { border-bottom-color: transparent; border-right-color: transparent; border-left-color: transparent; }
        .posTop .triangle_icon .before { border-bottom-color: transparent; border-right-color: transparent; border-left-color: transparent; }
          
        /*右边提示*/
        .posRight .triangle_icon { width: 12px; height: 12px; left: -12px; }
        .posRight .triangle_icon .after { left: 1px; }
        .posRight .triangle_icon .after { border-top-color: transparent; border-bottom-color: transparent; border-left-color: transparent; }
        .posRight .triangle_icon .before { border-top-color: transparent; border-bottom-color: transparent; border-left-color: transparent; }
          
        /*下边提示*/
        .posBottom .triangle_icon { width: 12px; height: 12px; top: -12px; }
        .posBottom .triangle_icon .after { top: 1px; }
        .posBottom .triangle_icon .after { border-top-color: transparent; border-right-color: transparent; border-left-color: transparent; }
        .posBottom .triangle_icon .before { border-top-color: transparent; border-right-color: transparent; border-left-color: transparent; }
          
          
        /*初始化时候的皮肤*/
        .validateInit .before { border-color: #F7CE39; }
        .validateInit .after { border-color: #FFFFE0; }
          
        /*失败时候的皮肤*/
        .validateError .before { border-color: red; }
        .validateError .after { border-color: orange; }
          
        /*成功时候的皮肤*/
        .validateSuc .before { border-color: Green; }
        .validateSuc .after { border-color: #79D62D; }
    </style>
    <script src="js/jquery-1.7.1.min.js" type="text/javascript"></script>
    <script src="js/yexiaochai_formValidator.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            var f = new FormValidator();
            f.init();
            f.validatorAll();
  
            var bt = $(\'#bt\');
            var add = $(\'#add\');
            var remove = $(\'#remove\');
            var name = $(\'#name\');
  
            bt.click(function () {
                var end = f.validatorState();
                var s = \'\';
            });
  
            add.click(function () {
                f.addValidator(name.val());
                var s = \'\';
            });
  
  
            remove.click(function () {
                f.removeValidator(name.val());
                var s = \'\';
            });
  
  
        });
    </script>
</head>
<body>
    <input type="text" id="name" />
    <input type="button" value="取消验证" id="remove" />
    <input type="button" value="添加验证" id="add" />
    <div class="form">
        <div>
            身份证:<input type="text" id="idCard" class="formValidate" data-cfg="{ check: \'true\', type: \'idCard\', msgPosition: \'right\', initMsg: \'请输入身份证号码!\', requred: true, sucMsg: \'正确\', errorMsg: \'格式错误\'}" />
        </div>
        <div>
            数字:<input type="text" id="num" class="formValidate" data-cfg="{ type: \'num\', initMsg: \'请输入数字\', msgPosition: \'top\'}" />
        </div>
        <div>
            邮件:<input type="text" class="formValidate" data-cfg="{ type: \'email\', initMsg: \'请输入邮箱地址!\'}" />
        </div>
        <div>
            手机:<input type="text" class="formValidate" data-cfg="{ type: \'phone\', initMsg: \'请请输入手机号码!\'}" />
        </div>
        <div>
            QQ:<input type="text" class="formValidate" data-cfg="{ type: /^[1-9]*[1-9][0-9]*$/, initMsg: \'请请输入手机号码!\'}" />
        </div>
        <div>
            用户名:<input type="text" />
        </div>
        <div>
            密码:<input type="text" />
        </div>
        <div>
            重复密码:<input type="text" />
        </div>
        <div>
            性别:
            <label>
                <input type="radio" name="Gender" value="0" />
                男</label>
            <label>
                <input type="radio" name="Gender" value="1" />
                女</label>
        </div>
        <div>
            爱好:
            <label>
                <input type="checkbox" name="aihao" value="0" />
                爱好1</label>
            <label>
                <input type="checkbox" name="aihao" value="1" />
                爱好2</label>
            <label>
                <input type="checkbox" name="aihao" value="0" />
                爱好3</label>
            <label>
                <input type="checkbox" name="aihao" value="1" />
                爱好4</label>
        </div>
        <input type="button" value="提交" id="bt" />
    </div>
</body>
</html>
  
View Code

这个demo中涉及到了挺多js验证代码!

分类:

技术点:

相关文章: