This repository was archived by the owner on Apr 30, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInputValidator.js
More file actions
320 lines (289 loc) · 7.88 KB
/
InputValidator.js
File metadata and controls
320 lines (289 loc) · 7.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
exmp__data = {
"#username": {
rules: {require: true, complex: {message: ""}, different: "#simple", remote: {url: '', handler: null}},
elements: null,
stat: ""
}
}
exmp_options = {
debug: true,
focusout: true,
custom: {
"#username": {
getValue: function () {
},
rangeMessage: function () {
},
handler: function () {
},
focusout: true
}
},
rangeMessage: function () {
},
message: {
require: "请填写用户名",
require: "请填写用户名",
require: "请填写用户名"
}
}
var Validator = (function () {
/**
* 构造函数
* @param rules
* @param opt
* @returns {_validator}
* @private
*/
var _validator = function (nodes, opt) {
if (!(this instanceof _validator)) {
return new _validator(nodes, opt)
}
this.nodes = nodes;
_data = buildData(nodes)
config(opt);
}
//总节点树
_data = {}
//默认配置参数
var options = {
debug: false,
focusout: false,
custom: null,
message: null,
rangeMsg: null,
block: true
}
/**
* 获取节点
* @param selector
* @returns {*}
*/
var getNodeValue = function (selector) {
var nodeList = document.querySelectorAll(selector);
if (nodeList.length == 0)
return null;
var values = [];
var type = nodeList[0].getAttribute('type');
return {nodeList: nodeList, type: type};
}
/**
* 构建节点树
* @param nodes
* @returns {{}}
*/
var buildData = function (nodes) {
var data = {}
for(var selector in nodes) {
var rules = nodes[selector]
var elements = getNodeValue(selector)
if (elements == null) {
break
} else {
for(var ruleName in rules){
var ruleParams = rules[ruleName]
if(typeof ruleParams != 'object'){
rules[ruleName] = ruleParams = {param: ruleParams}
}
}
data[selector] = {
rules: rules,
elements: elements,
stat: Validator.prototype.CONST.UNCHECK
}
}
}
return data
}
/**
* 加载配置参数
* @param options
*/
var config = function (opt) {
//覆盖默认配置
for(var pname in opt){
options[pname] = opt[pname]
}
//配置参数custom参数复制到_data下
if(options.custom){
for(var selector in options.custom){
if(_data[selector]){
for(var op in options.custom[selector]){
_data[selector][op] = options.custom[selector][op]
}
updateNodesListener(selector, "focusout")
}
}
}
}
/**
* 添加监听事件
* @param nodeList
* @param evType
* @param func
*/
var addEventListener = function (nodeList, evType, func) {
var foo = typeof func == "function" ? func : eventHandler
for(var i = 0; i < nodeList.length; i++){
if(nodeList[i].eventListener){
if(nodeList[i].eventListener[evType]){
nodeList[i].removeEventListener(evType, nodeList[i].eventListener[evType])
}else{
nodeList[i].addEventListener(evType, foo)
}
}
}
}
/**
* 默认事件处理程序
* @param ev
*/
var eventHandler = function (ev) {
alert("event")
}
/**
* 更新节点事件
* @param selector
* @param evType
*/
var updateNodesListener = function (selector, evType) {
if(_data[selector][evType]){
if(typeof _data[selector][evType] == "function")
addEventListener(evType, options.custom[selector][evType])
else
addEventListener(evType)
}else if(options.focusout){
if(typeof options[evType] == "function")
addEventListener(evType, options[evType])
else
addEventListener(evType)
}
}
/**
* 默认渲染错误信息方法
* @param node
* @param message
*/
var rangeMessage = function (node, message) {
console.log("default message ranger")
}
/**
* 校验函数
* @returns {{success: boolean, result: Array}}
*/
_validator.prototype.validate = function () {
var result = []
var ruleHandler = this.rules
for(var selector in _data){
var nodeRules = _data[selector]["rules"]
var nodeList = _data[selector]["elements"]["nodeList"]
var nodeType = _data[selector]["elements"]["type"]
var ruleParams = error = null;
for(var ruleName in nodeRules){
//规则库中是否已定义目标规则
if(ruleHandler[ruleName] == undefined){
throw new Error("rule "+ruleName+" handler is not implement")
}
ruleParams = nodeRules[ruleName];
//单节点校验
for(var n in nodeList){
nodeList[n]["stat"] = this.CONST.ONCHECK
var check = true;
if(typeof _data[selector]["handler"] == 'function'){
check = _data[selector]["handler"](nodeList[n], ruleParams)
}else{
check = ruleHandler[ruleName](nodeList[n], ruleParams)
}
var message = ""
if(ruleParams.message){
message = ruleParams.message
}else if(options.message[ruleName]){
message = options.message[ruleName]
}
//始终调用渲染函数
if(_data[selector]["rangeMessage"] && typeof _data[selector]["rangeMessage"] == "function"){
_data[selector]["rangeMessage"](nodeList[n], message)
}if(options["rangeMessage"] && typeof options["rangeMessage"] == "function"){
options["rangeMessage"](check, nodeList[n], message)
}else{
rangeMessage(check, nodeList[n], message)
}
if(!check){
error = {success: false, selector: selector, node: nodeList[n], errRule: ruleName, message: message }
result.push(error)
nodeList[n]["stat"] = this.CONST.FAILURE
break
}else{
nodeList[n]["stat"] = this.CONST.SUCCESS
}
}
}
if(error)
if(options.block == true)
return {success: result.length == 0 ? true : false, result: result};
}
return {success: result.length == 0 ? true : false, result: result};
}
_validator.prototype.rules = {
require: function (node) {
return !(node.value === undefined || node.value === null || node.value.replace(/\s/, "") === "")
},
complex: function (node) {
return (node.value.length >= 6)
}
}
_validator.prototype.setMessage = function (msg) {
options.message = msg
return this
}
_validator.prototype.CONST = {
SUCCESS: "success",
FAILURE: "failure",
ONCHECK: "oncheck",
UNCHECK: "uncheck"
}
_validator.prototype.TRIGGER = {
keyup: "keyup",
focusout: "focusout"
}
/**
* 单独设置校验逻辑
* @param selector
* @param rule
* @param handler
* @returns {Validator}
*/
_validator.prototype.setHandler = function (selector, rule, handler) {
try{
_data[selector][rule]["handler"] = handler
}catch(e){
console.log(e)
}
return this;
}
/**
* 节点有变化
* @param selector
*/
_validator.prototype.updateNode = function (selector) {
if(_data[selector]){
var elements = getNodeValue(selector)
if (elements == null) {
return false;
} else {
if(_data[selector]){
updateNodesListener(selector, "focusout")
}
}
}
}
/**
* ajax简单封装
* @param param
*/
_validator.prototype.ajax = function (param) {
$.ajax(param)
}
Object.defineProperty(_validator.prototype, "interface", {configurable: false, writable: false})
return _validator
})()