(function(factory) { if (typeof define === 'function' && define.amd) { // AMD define(['jquery'], factory); } else if (typeof exports === 'object') { // CommonJS factory(require('jquery')); } else { // Browser globals factory(jQuery, window, document); } }(function($, window, document, undefined) { /*************************绛栫暐瀵硅薄*****************************/ var RULES = { isNonEmpty: function(value, errorMsg) { //涓嶈兘涓虹┖ if (!value.length) { return errorMsg; } }, minLength: function(value, length, errorMsg) { //澶т簬 if (value.length < length) { return errorMsg; } }, maxLength: function(value, length, errorMsg) { //灏忎簬 if (value.length < length) { return errorMsg; } }, isMobile: function(value, errorMsg) { //鏄惁涓烘墜鏈哄彿鐮 if (!/(^1[3|5|8][0-9]{9}$)/.test(value)) { return errorMsg; } }, isEmail: function(value, errorMsg) { //鏄惁涓洪偖绠 if (!/(^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$)/.test(value)) { return errorMsg; } }, between: function(value, range, errorMsg) { //澶т簬灏忎簬 var min = parseInt(range.split('-')[0]); var max = parseInt(range.split('-')[1]); if (value.length < min || value.length > max) { return errorMsg; } }, onlyEn: function(value, errorMsg) { //绾嫳鏂 if (!/^[A-Za-z]+$/.test(value)) { } }, onlyZh: function(value, errorMsg) { //绾腑鏂 if (!/^[\u4e00-\u9fa5]+$/.test(value)) { return errorMsg; } }, onlyNum: function(value, errorMsg) { //鏁板瓧鍖呭惈灏忔暟 if (!/^[0-9]+([.][0-9]+){0,1}$/.test(value)) { return errorMsg; } }, onlyInt: function(value, errorMsg) { //鏁存暟 if (!/^[0-9]*$/.test(value)) { return errorMsg; } }, isChecked: function(value, errorMsg, el) { var i = 0; var $collection = $(el).find('input:checked'); if(!$collection.length){ return errorMsg; } } }; /*************************Validator绫?****************************/ var setting = { type: null, onBlur: null, onFocus: null, onChange: null, successTip: true }; var Validator = function() { this.cache = []; }; Validator.prototype.add = function(dom, rules) { var self = this; for (var i = 0, rule; rule = rules[i++];) { (function(rule) { var strategyAry = rule.strategy.split(':'); var errorMsg = rule.errorMsg self.cache.push(function() { var strategy = strategyAry.shift(); // 鍓嶅垹鍖归厤鏂瑰紡骞惰祴鍊 strategyAry.unshift(dom.value); // 鍓嶆彃value鍊 strategyAry.push(errorMsg); // 鍚庢彃鍑洪敊鎻愮ず strategyAry.push(dom); // 鍚庢彃dom if (!RULES[strategy]) { $.error('娌℃湁' + strategy + '瑙勫垯锛岃妫€鏌ュ懡鍚嶆垨鑷瀹氫箟'); } return { errorMsg: RULES[strategy].apply(dom, strategyAry), el: dom }; }); }(rule)); } }; Validator.prototype.start = function() { var result; for (var i = 0, validatorFunc; validatorFunc = this.cache[i++];) { var result = validatorFunc(); if (setting.successTip) { new Validator().showMsg($(result.el), '', 1); } if (result.errorMsg) { return result; } }; return true; }; Validator.prototype.showMsg = function(target, msg, status, callback) { //status // 0 : tip // 1 : success // 2 : error var _current = status ? (status > 1 ? 'error' : 'success') : 'tip'; var $context = target.parent(); var $msg = $context.find('.valid_message'); var _other = target.attr('data-type') || ''; $msg.remove(); $context.removeClass('success tip error').addClass(_current+' '+_other).append('' + msg + ''); }; var plugin = { init: function(options) { var $form = this; var $body = $('body'); var $required = $form.find('.required'); setting = $.extend(setting, options); if (setting.type) { $.extend(RULES, setting.type); } var validator = new Validator(); $body.on({ focus: function(event) { var $this = $(this); var _tipMsg = $this.attr('data-tip') || ''; var _status = $this.attr('data-status'); if (_status === undefined ||!parseInt(_status)) { validator.showMsg($this, _tipMsg); } setting.onFocus ? setting.onFocus.call($this, arguments) : ''; }, blur: function(event) { var $this = $(this); var dataValid = $this.attr('data-valid'); var validLen = dataValid.split('||'); var errCollection = $this.attr('data-error'); var errMsgAry = errCollection.split("||"); var strategyAry, strategy, errMsg; for (var i = 0; i < validLen.length; i++) { strategyAry = validLen[i].split(':'); strategy = strategyAry.shift(); strategyAry.unshift(this.value); strategyAry.push(errMsgAry[i]); strategyAry.push(this); errMsg = RULES[strategy].apply(this, strategyAry); if (errMsg) { $this.attr('data-status', 0); validator.showMsg($this, errMsg, 2); break; } }; if (!errMsg) { $this.attr('data-status', 1); setting.successTip ? validator.showMsg($this, '', 1) : $this.parent().find('.valid_message').remove(); } setting.onBlur ? setting.onBlur.call($this, arguments) : ''; }, change: function(event) { setting.onChange ? setting.onChange.call($this, arguments) : ''; } }, '.required'); }, submitValidate: function(options) { var $form = options || this; var $body = $('body'); var $required = $form.find('.required'); var validator = new Validator(); var $target; $.each($required, function(index, el) { var $el = $(el); var dataValid = $el.attr('data-valid'); var validLen = dataValid.split('||'); var errCollection = $el.attr('data-error'); var errMsgAry = errCollection.split("||"); var ruleAry = []; for (var i = 0; i < validLen.length; i++) { ruleAry.push({ strategy: validLen[i], errorMsg: errMsgAry[i] }); }; validator.add(el, ruleAry); }); var result = validator.start(); if (result.errorMsg) { $target = $(result.el); //$target.attr('data-status', 0)[0].focus(); validator.showMsg($target, result.errorMsg, 2); return false; } return true; } }; $.fn.validate = function() { var method = arguments[0]; if (plugin[method]) { method = plugin[method]; arguments = Array.prototype.slice.call(arguments, 1); } else if (typeof(method) == 'object' || !method) { method = plugin.init; } else { $.error('Method ' + method + ' does not exist on jQuery.validate Plugin'); return this; } return method.apply(this, arguments); } }))