最近准备把公司开发的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验证代码!