Easyui validatebox的验证提示十分好用,可是在实际项目的运用中,经常会遇到需要服务器验证后并返回验证结果信息,比如验证用户名、手机号、邮箱是否已存在。于是就想着怎么拓展Easyui的验证策略,使其支持服务端验证。具体实现代码如下:
文件名称:jquery.easyui.extend.validate.js
/** * 功能:拓展easyui 自定义验证框规则 * 用法: 与easyui自带的验证框使用方法一致 */ $.extend($.fn.validatebox.defaults.rules,{ minLength:{// 判断最小长度 validator:function(value,param) { return value.length>=param[0]; }, message:\'请最少输入{0}个字符.\' }, length:{ validator:function(value,param){ var len=$.trim(value).length; return len>=param[0]&&len<=param[1]; }, message:"输入内容长度必须介于{0}和{1}之间." }, phone:{// 验证电话号码 validator:function(value) { return /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/i.test(value); }, message:\'格式不正确,请使用如下格式:020-88888888\' }, mobile:{// 验证手机号码 validator:function(value) { return /^(11|12|13|14|15|16|17|18|19)\d{9}$/i.test(value); }, message:\'手机号码格式不正确,请使用如下格式:13118957545\' }, idcard:{// 验证身份证 validator:function(value) { return /^\d{15}(\d{2}[A-Za-z0-9])?$/i.test(value); }, message:\'身份证号码格式不正确\' }, intOrFloat:{// 验证整数或小数 validator:function(value) { return /^\d+(\.\d+)?$/i.test(value); }, message:\'请输入数字,并确保格式正确\' }, currency:{// 验证货币 validator:function(value) { return /^\d+(\.\d+)?$/i.test(value); }, message:\'货币格式不正确\' }, qq:{// 验证QQ,从10000开始 validator:function(value) { return /^[1-9]\d{4,9}$/i.test(value); }, message:\'QQ号码格式不正确\' }, integer:{// 验证整数 validator:function(value) { return /^[+]?[1-9]+\d*$/i.test(value); }, message:\'请输入大于0的整数\' }, number:{// 验证数字 validator:function(value) { return /^[+]?[0-9]+\d*$/i.test(value); }, message:\'请输入正整数\' }, chinese:{// 验证中文 validator:function(value) { return /^[\u0391-\uFFE5]+$/i.test(value); }, message:\'请输入中文\' }, english:{// 验证英语 validator:function(value) { return /^[A-Za-z]+$/i.test(value); }, message:\'请输入英文\' }, unnormal:{// 验证是否包含空格和非法字符 validator:function(value) { return /.+/i.test(value); }, message:\'输入值不能为空和包含其他非法字符\' }, username:{// 验证用户名 validator:function(value) { return /^[a-zA-Z][a-zA-Z0-9_]{5,15}$/i.test(value); }, message:\'用户名不合法(字母开头,允许6-16字符长度,允许字母数字下划线)\' }, faxno:{// 验证传真 validator:function(value) { // return /^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/i.test(value); return /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/i.test(value); }, message:\'传真号码不正确\' }, zip:{// 验证邮政编码 validator:function(value) { return /^[1-9]\d{5}$/i.test(value); }, message:\'邮政编码格式不正确\' }, ip:{// 验证IP地址 validator:function(value) { return /d+.d+.d+.d+/i.test(value); }, message:\'IP地址格式不正确\' }, name:{// 验证姓名,可以是中文或英文 validator:function(value) { return /^[\u0391-\uFFE5]+$/i.test(value)|/^\w+[\w\s]+\w+$/i.test(value); }, message:\'请输入姓名\' }, carNo:{ //验证车牌号码 validator:function(value){ return /^[\u4E00-\u9FA5][\da-zA-Z]{6}$/.test(value); }, message:\'车牌号码无效(例:粤J12350)\' }, carenergin:{ validator:function(value){ return /^[a-zA-Z0-9]{16}$/.test(value); }, message:\'发动机型号无效(例:FG6H012345654584)\' }, email:{ //验证邮箱 validator:function(value){ return /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(value); }, message:\'请输入有效的电子邮件账号(例:abc@126.com)\' }, msn:{ //验证msn validator:function(value){ return /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(value); }, message:\'请输入有效的msn账号(例:abc@hotnail(msn/live).com)\' }, same:{ //确认两次密码是否一致 validator:function(value,param){ if($("#"+param[0]).val() !=""&&value!=""){ return $("#"+param[0]).val() ==value; }else{ return true; } }, message:\'两次输入的密码不一致!\' }, // 验证编码是否重复【后端服务器验证返回】 productBasisVerify: { validator: function(value, param) { if (value != "") { var result = false; $.ajax({ type: \'POST\', url: ProductBase.urls[\'verifyData\'], data: {verify: param, value: value}, dataType: \'json\', async: false, // 关闭异步 success: function(rec) { if (rec.success){ result = true; } else { result = false; } } }); return result; } }, message: \'该编码已被使用,请换个试试!\' }, license:{//验证营业执照 validator:function(value){ return/^\d{15}$/.test(value); }, message:\'营业执照格式输入错误\' }, texture:{//验证组织机构代码 validator:function(value){ return/^[a-zA-Z0-9]\S(([0-9]){7}\S)?[a-zA-Z0-9]+$/.test(value); }, message:\'组织机构代码格式输入错误\' }, taxation_number:{//验证税务登记证 validator:function(value){ return/(^\d\S{14}|^\d\S{17})$/.test(value); }, message:\'税务登记证格式输入错误\' }, bank_account:{//验证银行卡号 validator:function(value){ return/^[0-9]*$/.test(value); }, message:\'银行卡号格式输入错误\' }, });
Easyui本身的验证机制是设置一个计时器,然后按照计时器触发验证规则进行验证,但是对应长的文本输入框,就会导致还未完全输入就已经验证了好几次了。有人说把Easyui的计时器修改短一点不就行了嘛,但是对于编码、手机号码这些短的字段要进行校验呢?校验效果又不理想了,所以最终的解决办法如下:
<script type="text/javascript"> $(function(){
// 元素失去焦点进行验证 $(\'#base_part_edit_form .easyui-validatebox-blur\').bind(\'blur\', function(){ $(this).validatebox(\'enableValidation\'); });
// 元素获得焦点关闭验证 $(\'#base_part_edit_form .easyui-validatebox-blur\').bind(\'focus\', function(){ $(this).validatebox(\'disableValidation\'); }); }) </script>