130 lines
3.1 KiB
JavaScript
130 lines
3.1 KiB
JavaScript
/*------ 表单验证 -------*/
|
|
var __rules = {}
|
|
Anot.validate = function(key, cb) {
|
|
if (!__rules[key]) {
|
|
throw new Error('validate [' + key + '] not exists.')
|
|
}
|
|
if (typeof cb === 'function') {
|
|
__rules[key].event = cb
|
|
}
|
|
var result = __rules[key].result
|
|
for (var k in result) {
|
|
if (!result[k].passed) {
|
|
return result[k]
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
Anot.directive('rule', {
|
|
priority: 2010,
|
|
init: function(binding) {
|
|
if (binding.param && !__rules[binding.param]) {
|
|
__rules[binding.param] = {
|
|
event: noop,
|
|
result: {}
|
|
}
|
|
}
|
|
binding.target = __rules[binding.param]
|
|
},
|
|
update: function(opt) {
|
|
var _this = this
|
|
var elem = this.element
|
|
if (!['INPUT', 'TEXTAREA'].includes(elem.nodeName)) {
|
|
return
|
|
}
|
|
if (elem.msBinded) {
|
|
return
|
|
}
|
|
if (this.target) {
|
|
this.target.result[elem.expr] = { key: elem.expr }
|
|
}
|
|
var target = this.target
|
|
|
|
// 0: 验证通过
|
|
// 10001: 不能为空
|
|
// 10002: 必须为合法数字
|
|
// 10003: Email格式错误
|
|
// 10004: 手机格式错误
|
|
// 10005: 必须为纯中文
|
|
// 10006: 格式匹配错误(正则)
|
|
// 10011: 输入值超过指定最大长度
|
|
// 10012: 输入值短于指定最小长度
|
|
// 10021: 输入值大于指定最大数值
|
|
// 10022: 输入值小于指定最小数值
|
|
// 10031: 与指定的表单的值不一致
|
|
function checked(ev) {
|
|
var val = elem.value
|
|
var code = 0
|
|
|
|
if (opt.require && (val === '' || val === null)) {
|
|
code = 10001
|
|
}
|
|
|
|
if (code === 0 && opt.isNumeric) {
|
|
code = !isFinite(val) ? 10002 : 0
|
|
}
|
|
|
|
if (code === 0 && opt.isEmail)
|
|
code = !/^[\w\.\-]+@\w+([\.\-]\w+)*\.\w+$/.test(val) ? 10003 : 0
|
|
|
|
if (code === 0 && opt.isPhone) {
|
|
code = !/^1[34578]\d{9}$/.test(val) ? 10004 : 0
|
|
}
|
|
|
|
if (code === 0 && opt.isCN) {
|
|
code = !/^[\u4e00-\u9fa5]+$/.test(val) ? 10005 : 0
|
|
}
|
|
|
|
if (code === 0 && opt.exp) {
|
|
code = !opt.exp.test(val) ? 10006 : 0
|
|
}
|
|
|
|
if (code === 0 && opt.maxLen) {
|
|
code = val.length > opt.maxLen ? 10011 : 0
|
|
}
|
|
|
|
if (code === 0 && opt.minLen) {
|
|
code = val.length < opt.minLen ? 10012 : 0
|
|
}
|
|
|
|
if (code === 0 && opt.hasOwnProperty('max')) {
|
|
code = val > opt.max ? 10021 : 0
|
|
}
|
|
|
|
if (code === 0 && opt.hasOwnProperty('min')) {
|
|
code = val < opt.min ? 10022 : 0
|
|
}
|
|
|
|
if (code === 0 && opt.eq) {
|
|
var eqVal = parseVmValue(_this.vmodels[0], opt.eq)
|
|
code = val !== eqVal ? 10031 : 0
|
|
}
|
|
|
|
target.result[elem.expr].code = code
|
|
target.result[elem.expr].passed = opt.require
|
|
? code === 0
|
|
: val
|
|
? code === 0
|
|
: true
|
|
|
|
var passed = true
|
|
for (var k in target.result) {
|
|
if (!target.result[k].passed) {
|
|
passed = false
|
|
target.event(target.result[k])
|
|
break
|
|
}
|
|
}
|
|
if (passed) {
|
|
target.event(true)
|
|
}
|
|
}
|
|
Anot(elem).bind('blur', checked)
|
|
this.rollback = function() {
|
|
Anot(elem).unbind('blur', checked)
|
|
}
|
|
elem.msBinded = true
|
|
checked()
|
|
}
|
|
})
|