基于Layui Form改写的JavaScript表单验证插件
1 /** 2 * @name mrc 2018-4-6 3 * @description 表单校验 依赖Jq 改写自layui form 4 */ 5 ;!function($) { 6 "use strict"; 7 var MOD_NAME = 'form'; 8 var ELEM = '.mrc-form'; 9 var eventConfig = { 10 event: {} //记录模块自定义事件 11 } 12 var Form = function() { 13 this.config = { 14 verify: { 15 required: [ 16 /[\S]+/, '必填项不能为空' 17 ], 18 phone: [ 19 /^1\d{10}$/, '请输入正确的手机号' 20 ], 21 email: [ 22 /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/, '邮箱格式不正确' 23 ], 24 url: [ 25 /(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/, '链接格式不正确' 26 ], 27 number: function(value) { 28 if(!value || isNaN(value)) return '只能填写数字' 29 }, 30 date: [ 31 /^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/, '日期格式不正确' 32 ], 33 identity: [ 34 /(^\d{15}$)|(^\d{17}(x|X|\d)$)/, '请输入正确的身份证号' 35 ] 36 } 37 }; 38 }; 39 //基础功能 40 var baseTool = function() { 41 //遍历 42 this.each=function(obj, fn) { 43 var key, that = this; 44 if(typeof fn !== 'function') return that; 45 obj = obj || []; 46 if(obj.constructor === Object) { 47 for(key in obj) { 48 if(fn.call(obj[key], key, obj[key])) break; 49 } 50 } else { 51 for(key = 0; key < obj.length; key++) { 52 if(fn.call(obj[key], key, obj[key])) break; 53 } 54 } 55 return that; 56 }, 57 //获取设备信息 58 this.device=function(key) { 59 var agent = navigator.userAgent.toLowerCase() 60 ,getVersion = function(label) { 61 var exp = new RegExp(label + '/([^\\s\\_\\-]+)'); 62 label = (agent.match(exp) || [])[1]; 63 return label || false; 64 } 65 //返回结果集 66 ,result = { 67 //底层操作系统 68 os: function() { 69 if(/windows/.test(agent)) { 70 return 'windows'; 71 } else if(/linux/.test(agent)) { 72 return 'linux'; 73 } else if(/iphone|ipod|ipad|ios/.test(agent)) { 74 return 'ios'; 75 } else if(/mac/.test(agent)) { 76 return 'mac'; 77 } 78 }() 79 //ie版本 80 ,ie: function() { 81 return(!!window.ActiveXObject || "ActiveXObject" in window) ? ( 82 (agent.match(/msie\s(\d+)/) || [])[1] || '11' //由于ie11并没有msie的标识 83 ) : false; 84 }() 85 //是否微信 86 ,weixin: getVersion('micromessenger') 87 }; 88 //任意的key 89 if(key && !result[key]) { 90 result[key] = getVersion(key); 91 } 92 //移动设备 93 result.android = /android/.test(agent); 94 result.ios = result.os === 'ios'; 95 return result; 96 } 97 } 98 var basetool=new baseTool(); 99 var device=basetool.device(); 100 //模块事件 101 var eventDefined=function(){ 102 this.event = function(modName, events, params){ 103 var that = this 104 ,result = null 105 ,filter = events.match(/\(.*\)$/)||[] //提取事件过滤器 106 ,set = (events = modName + '.'+ events).replace(filter, '') //获取事件本体名 107 ,callback = function(_, item){ 108 var res = item && item.call(that, params); 109 res === false && result === null && (result = false); 110 }; 111 basetool.each(eventConfig.event[set], callback); 112 filter[0] && basetool.each(eventConfig.event[events], callback); //执行过滤器中的事件 113 return result; 114 }, 115 this.onevent = function(modName, events, callback){ 116 if(typeof modName !== 'string' 117 || typeof callback !== 'function') return this; 118 eventConfig.event[modName + '.' + events] = [callback]; 119 return this; 120 } 121 } 122 var eventdefined=new eventDefined(); 123 //全局设置 124 Form.prototype.set = function(options) { 125 var that = this; 126 $.extend(true, that.config, options); 127 return that; 128 }; 129 //验证规则设定 130 Form.prototype.verify = function(settings) { 131 var that = this; 132 $.extend(true, that.config.verify, settings); 133 return that; 134 }; 135 //表单事件监听 136 Form.prototype.on = function(events, callback) { 137 return eventdefined.onevent.call(this, MOD_NAME, events, callback); 138 }; 139 //表单提交校验 140 var submit = function() { 141 var button = $(this), 142 verify = form.config.verify, 143 stop = null, 144 DANGER = 'mrc-form-danger', 145 field = {}, 146 elem = button.parents(ELEM) 147 148 , 149 verifyElem = elem.find('*[mrc-verify]') //获取需要校验的元素 150 , 151 formElem = button.parents('form')[0] //获取当前所在的form元素,如果存在的话 152 , 153 fieldElem = elem.find('input,select,textarea') //获取所有表单域 154 , 155 filter = button.attr('mrc-filter'); //获取过滤器 156 var eventlist=[]; 157 //开始校验 158 basetool.each(verifyElem, function(_, item) { 159 var othis = $(this), 160 vers = othis.attr('mrc-verify').split('|') 161 ,verType = othis.attr('mrc-verType') 162 ,value = othis.val(); 163 othis.removeClass(DANGER); 164 basetool.each(vers, function(_, thisVer) { 165 var isTrue //是否命中校验 166 , errorText = '' //错误提示文本 167 ,isFn = typeof verify[thisVer] === 'function'; 168 //匹配验证规则 169 if(verify[thisVer]) { 170 var isTrue = isFn ? errorText = verify[thisVer](value, item) : !verify[thisVer][0].test(value); 171 errorText = errorText || verify[thisVer][1]; 172 //如果是必填项或者非空命中校验 173 if(isTrue) 174 { 175 var em={elem:othis,msg:errorText}; 176 eventlist.push(em); 177 if(!device.android && !device.ios) item.focus(); //非移动设备自动定位焦点 178 othis.addClass(DANGER); 179 return stop = true; 180 } 181 } 182 }); 183 if(stop) return stop; 184 }); 185 if(stop) 186 { 187 //获取字段 188 return eventdefined.event.call(this, MOD_NAME, 'submit(' + filter + ')', { 189 eventlist:eventlist 190 //return false; 191 }); 192 } 193 var nameIndex = {}; //数组 name 索引 194 basetool.each(fieldElem, function(_, item) { 195 item.name = (item.name || '').replace(/^\s*|\s*&/, ''); 196 197 if(!item.name) return; 198 199 //用于支持数组 name 200 if(/^.*\[\]$/.test(item.name)) { 201 var key = item.name.match(/^(.*)\[\]$/g)[0]; 202 nameIndex[key] = nameIndex[key] | 0; 203 item.name = item.name.replace(/^(.*)\[\]$/, '$1[' + (nameIndex[key]++) + ']'); 204 } 205 206 if(/^checkbox|radio$/.test(item.type) && !item.checked) return; 207 field[item.name] = item.value; 208 }); 209 //获取字段 210 return eventdefined.event.call(this, MOD_NAME, 'submit(' + filter + ')', { 211 elem: this, 212 form: formElem, 213 field: field, 214 eventlist:eventlist 215 }); 216 }; 217 //实例化 218 var form = new Form(),dom = $(document); 219 //表单提交事件 220 dom.on('submit', ELEM, submit) 221 .on('click', '*[mrc-submit]', submit); 222 //暴露模块 223 window.mrcForm = form; 224 }(jQuery);
HTML Demo
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title></title> </head> <body> <p>表单1(验证消息打印在控制台)</p> <form class="mrc-form"> <input type="text" name="title" mrc-verify="required|email" placeholder="请输入邮箱"> <input type="text" name="password" mrc-verify="required|number" placeholder="请输入数字"> <button mrc-submit mrc-filter="formDemo">立即提交</button> </form> <p>表单2(验证消息打印在控制台)</p> <form class="mrc-form"> <input type="text" name="title" mrc-verify="required|number" placeholder="请输入数字"> <button mrc-submit mrc-filter="formDemo2">立即提交</button> </form> </body> </html> <script type="text/javascript" src="js/jquery.min.js" ></script> <script type="text/javascript" src="js/Verify.js" ></script> <script type="text/javascript"> mrcForm.on('submit(formDemo)',function(data){ console.log(data.eventlist[0].msg);//验证错误消息 console.log(data.eventlist[0].elem);//验证不通过的元素 相当于 document.getElementById(id) return false; }); mrcForm.on('submit(formDemo2)',function(data){ console.log(data); //打印返回对象 return false; }); </script>
使用介绍
由于项目中经常用到表单验证 而且当项目中整体框架用了某一个框架之后 如果再引用其他框架 可能存在其他问题 而如果在页面直接写验证的话 每次都要写相同的代码 想想就非常的蛋疼 程序员当然要想着怎么偷懒了 能不动手那肯定就不动手啊
自己写个吧 感觉已经有轮子了 总是造别人的轮子干嘛( 咳咳 其实是基础差 又懒罢了) 而且之前接触layui 发现他的表单带有验证功能 而且又是开源的 那肯定搞起啊 于是就稍稍的改了一写 勉强能用用吧
这个要依赖于jq 当然里面用到的jq功能也不多就几个小地方 有兴趣的可以自行改造一下 只需标明原出处是layui就行了 开源精神还是要遵循的嘛
插件暴露给外部一个mrcForm对象
mrcForm.on('submit(formDemo2)',function(data){
console.log(data); //打印返回对象
return false;
});
formDemo2 为提交按钮上加的属性
<button mrc-submit mrc-filter="formDemo2">立即提交</button>
mrc-verify="required|email" 这个是加的验证规则 用|符号分隔 可在代码里自行加其他的验证规则
<input type="text" name="password" mrc-verify="required|number" placeholder="请输入数字">

浙公网安备 33010602011771号