UNPKG

ecui

Version:

Enterprise Classic User Interface.

205 lines (180 loc) 5.96 kB
/** * validator * Copyright 2012 Baidu Inc. All rights reserved. * * path: validator.js * desc: 验证器 * author: cxl(chenxinle@baidu.com) * date: 2012/03/09 */ (function () { var core = ecui, ui = core.ui, util = core.util, REGEXP = RegExp, triggerEvent = core.triggerEvent, VALIDATOR_RULES = {}, VALIDATOR_RULES_ORDER = []; util.validator = { /** * 根据验证规则对数据进行验证 * @public * * @param {Object} value 待验证的数据 * @param {Array} rules 验证规则集合,按照数组顺序进行验证 * * @return {Object} 验证结果 * {Boolean} state 验证结果 * {String} name 验证失败时对应的验证规则名称 * {Object} rule 验证失败时对应的验证要求 */ validate: function (value, rules) { var i = 0, item, res = true; while (res && rules[i]) { item = rules[i++]; res = VALIDATOR_RULES[item.name].call(null, value, item.rule) } //构造验证结果对象 if (!res) { res = {state: false, name: item.name, rule: item.rule}; } else { res = {state: true}; } return res; }, /** * 增加验证器 * @public * * @param {String} ruleName 验证器规则的名称 * @param {Function} call 验证函数 接口形式如下 * @param {Object} value 待验证的数据 * @param {Object} rule 验证要求 * @return {Boolean} 验证是否通过 */ addRule: function (ruleName, call) { VALIDATOR_RULES[ruleName] = call; VALIDATOR_RULES_ORDER.push(ruleName); }, /** * 收集验证信息 * 按照系统默认的验证顺序收集验证规则 * 用于在控件收集自生的验证规则 * * @param {Object} 参数 key: 验证规则名, value:验证要求 * @return {Array} 验证规则 * {String} name 验证名称 * {Object} rule 验证要求 */ collectRules: function (options) { var i, name, rules = []; for (i = 0; name = VALIDATOR_RULES_ORDER[i]; i++) { if (options.hasOwnProperty(name)) { rules.push({name: name, rule: options[name]}); } } return rules; } }; /** * 添加非空验证器 */ util.validator.addRule('require', function (value) { if ('[object Array]' == Object.prototype.toString.call(value)) { return value.length !== 0; } else { value += ''; return !!value; } }); /** * 添加正则验证器 */ util.validator.addRule('patterMatch', function (value, rule) { var exp = new REGEXP(rule); return exp.test(value); }); /** * 添加类型验证器 * 支持URL, email格式验证 */ util.validator.addRule('typeMatch', function (value, rule) { var patter = { Url: /^[^.。,]+(\\.[^.,。]+)+$/, Require: /.+/, Email: /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/, Tel: /^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/, Mobile: /^0?(13[0-9]|15[0-9]|18[0236789]|14[57])[0-9]{8}$/, Url: /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/, Currency:/^\d+(\.\d+)?$/, Number: /^\d+$/, Zip: /^[1-9]\d{5}$/, Ip: /(\d)\.(\d)\.(\d)\.(\d)/, Integer: /^[-\+]?\d+$/, Double: /^[-\+]?\d+(\.\d+)?$/, English: /^[A-Za-z]+$/, Chinese: /^[\u0391-\uFFE5]+$/, Username:/^[a-z]\w{3,}$/i, Name: /^[\u0391-\uFFE5A-Za-z0-9]+$/ } rule = patter[rule]; if (rule && rule.test(value)) { return true; } else { return false; } }); /** * 最大字符长度验证器 */ util.validator.addRule('maxLength', function(value, rule) { return value.length <= rule; }); /** * 最小字符长度验证器 */ util.validator.addRule('minLength', function(value, rule) { return value.length >= rule; }); /** * 最大值验证器 */ util.validator.addRule('maxValue', function(value, rule) { return value <= rule; }); /** * 最小值验证器 */ util.validator.addRule('minValue', function(value, rule) { return value >= rule; }); /** * 扩展Input控件,添加验证方法 */ var UI_INPUT_CONTROL_CLASS = ui.InputControl.prototype; /** * override */ UI_INPUT_CONTROL_CLASS.validate = function () { var res = true, valid; valid = util.validator.validate(this.getValue(), this._aValidateRules); res = valid.state; if (!res) { triggerEvent(this, 'invalid', null, [valid.name, valid.rule]); } return res; }; /** * 设置验证规则 * @public * * @param {String} name 验证规则名称 * @param {Object} rule 验证要求 */ UI_INPUT_CONTROL_CLASS.setValidateRules = function (options) { this._aValidateRules = util.validator.collectRules(options); }; })();