valid.js
11 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
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
/***
*验证组件,通过valid属性进行标识,通过validname和validlname内容进行提示。
*
* @param flag {是否验证隐藏域,默认不验证,true验证} TODO 待议
*
*@return boolean {验证成功返回true 验证失败返回false,并提示失败信息}
*/
function validForm(flag){
var visible = '';
flag = flag || false;
if(flag) visible = ':visible';
var having=true;
var notice ;
$("[valid^='v']"+visible).each(function() {
//提示信息,如果validlname存在直接输出,如果不存在通过validname拼接默认提示
var that = $(this);
var valid = that.attr("valid");
var valids = valid.split("_");
if(isEmpty(that.val())){
//处理必填项(v*_y)
if(valids[1]=='y') {
_valid("不能为空","");
}
//处理必填项(vtext)
if(valids[0]=='vtext') {
_valid("不能为空","");
}
//处理时间组件不能为空,特殊处理
else if(valids[0]=='vdate'){
if(isEmpty(that.val())) _valid("不能为空","");
}
}else{
//处理下拉选择框
if(valids[0]=='vselect') {
if(that.val()=='-1') _valid("必须选择","-1");
}
//处理整数类型(vnum_n_0_31)
else if(valids[0]=='vnum') {
if(!isInt(that.val())) _valid("必须为整数","");
//数字区间验证
else if(!checkInt(that.val(),valids[2],valids[3]))
_valid("必须在"+valids[2]+"和"+valids[3]+"之间","");
}
//处理数字类型
else if(valids[0]=='vfloat') {
if(!isFloat(that.val())) _valid("必须为数字","");
//数字区间验证
else if(!checkFloat(that.val(),valids[2],valids[3]))
_valid("必须在"+valids[2]+"和"+valids[3]+"之间","");
}
//处理Email
else if(valids[0]=='vemail') {
if(!isEmail(that.val())) _valid("格式错误","");
}
//处理手机号码
else if(valids[0]=='vmobile') {
if(!isMobile(that.val())) _valid("格式错误","");
}
//处理电话号码
else if(valids[0]=='vphone') {
if(!isPhone(that.val())) _valid("格式错误","");
}
}
function _valid(noticeValue,defaultValue){
var content = that.attr('validname') || '';
var lcontent = that.attr('validlname');
notice = typeof(lcontent) == 'undefined'?content + noticeValue + ',请重新填写!':lcontent;
if(having) Alert(notice,function(){
if(valids[0]!='vdate') that.focus();
if(valids[0]=='vdate') that[0].focus();
});
if(valids[0]!='vdate'){ //vdate不做样式处理
that.css("border","1px dashed red");
that.bind("change",function(){
var solid = "1px solid #a5ccf8";
if(valids[0]=='vnum'){
if(checkInt(that.val(),valids[2],valids[3])) that.css("border",solid);
}
else if(valids[0]=='vfloat'){
if(checkFloat(that.val(),valids[2],valids[3])) that.css("border",solid);
}
else if(valids[0]=='vemail') {
if(isEmail(that.val())) that.css("border",solid);
}
else if(valids[0]=='vmobile') {
if(isMobile(that.val())) that.css("border",solid);
}
else if(valids[0]=='vphone') {
if(isPhone(that.val())) that.css("border",solid);
}
else {
if(that.val() != defaultValue) that.css("border",solid);
};
});
}
having=false;
}
});
return having;
}
/**
* 验证成功后,提交表单
*
* @param url {提交的URL}
* @param formObj {form对象}
* @param flag {是否验证隐藏域,默认不验证,true验证}
*
* @return {Boolean}
*/
function submitForm(url,formObj,flag){
if(validForm(flag)){
url = url || '';
formObj = formObj || document.form1;
if(url != '') formObj.action=url;
formObj.submit();
}
}
/**
* 判断某个字符是否为空,如果为空则返回true,否则返回false.
*
* @param {我们要验证的字符}
* str
* @return {Boolean}
*/
function isEmpty(str) {
str = str || '';
if ((str == null) || (str.length == 0))
return true;
else
return false;
}
/**
* 判断某个字符是否是数字.
*
* @param {我们要验证的字符}
* theNum
* @return {Boolean}
*/
function isDigit(theNum) {
var theMask = '0123456789';
if (isEmpty(theNum))
return false;
else if (theMask.indexOf(theNum) == -1)
return false;
return true;
}
/**
* 判断某个字符是不是整型,第二个参数是是否支持负数,默认不支持负数.
*
* @param {我们要验证的字符}
* theStr
* @param {判断是不是支持负数,默认不支持负数}
* isNegative
* @return {} 使用示例: var age = form1.age.value; if(!isInt(age,true)){
* alert("年龄必须为整数!"); return ; }
*/
function isInt(theStr, isNegative) {
isNegative = isNegative || false;
var flag = true;
if (isEmpty(theStr)) {
flag = false;
} else {
var i = theStr.length ;
while (i--) {
if (isNegative == true && i == 0) {
if (theStr.substring(0, 1) == '-' && theStr.length == 1) {
flag = false;
break;
} else if (theStr.substring(0, 1) != '-' && isDigit(theStr.substring(0, 1)) == false) {
flag = false;
break;
}
} else if (isDigit(theStr.substring(i, i + 1)) == false) {
flag = false;
break;
}
}
}
return flag;
}
/********************************************
检测数字区间
theStr-被检测字符串
min-最小值(为''时不进行此项检测)
max-最大值(为''时不进行此项检测)
********************************************/
function checkInt ( theStr,min, max ) {
min = min || '';
max = max || '';
if (!isInt(theStr)) {
return false;
}else{
if ( !isEmpty(min) && parseInt( theStr ) < min ) {
return false;
}
if ( !isEmpty(max) && parseInt( theStr ) > max ) {
return false;
}
}
return true;
}
/**
* 判断是不是浮点数,第二个参数是指是否支持负数.
*
* @param {我们要验证的字符}
* theStr
* @param {是否支持负数}
* isNegative
* @return {Boolean} 使用示例: var money = form1.money.value;
* if(!isFloat(money,true)){ alert("试用期工资必须为数字格式!"); return ; }
*/
function isFloat(theStr, isNegative) {
var dot1st = theStr.indexOf('.');
var dot2nd = theStr.lastIndexOf('.');
if (isEmpty(theStr))
return false;
if (dot1st == -1) {
if (isInt(theStr, isNegative))
return true;
else
return false;
} else if (dot1st != dot2nd || dot1st == 0)
return false;
else {
var intPart = theStr.substring(0, dot1st);
var decPart = theStr.substring(dot2nd + 1);
// 判断是否支持负数:是指前一部分是否支持负数,后面的部分不支持负数
if (!isInt(intPart, isNegative) || !isInt(decPart))
return false;
else if (isEmpty(decPart))
return false;
else
return true;
}
}
/********************************************
检测是否是数字类型、并且大于最小值,小于最大值
theStr-被检测字符串
min-最小值(为null时不进行此项检测)
max-最大值(为null时不进行此项检测)
********************************************/
function checkFloat ( theStr,min, max ) {
min = min || '';
max = max || '';
if (!isFloat(theStr)) {
return false;
}else{
if ( !isEmpty(min) && parseFloat( theStr ) < min ) {
return false;
}
if ( !isEmpty(max) && parseFloat( theStr ) > max ) {
return false;
}
}
return true;
}
//邮箱验证方法,如果是空返回false
function isEmail(theStr) {
var pattern = /(^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$)/;
return _match(theStr,pattern) ;
}
//手机号码验证信息,如果是空返回false
function isMobile(theStr) {
var pattern = /(^0{0,1}1[3|4|5|6|7|8|9][0-9]{9}$)/;
return _match(theStr,pattern) ;
}
//判断是否为正确的电话号码(可以含"()"、"()"、"+"、"-"和空格),如果是空返回false
function isPhone(theStr){
//国家代码(2到3位)-区号(2到3位)-电话号码(7到8位)-分机号(3位)"
var pattern =/(^[0-9]{3,4}\-[0-9]{7,8}$)|(^[0-9]{7,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)/;
return _match(theStr,pattern) ;
}
//正则匹配字符串
function _match (theStr,pattern) {
if (isEmpty(theStr))
return false;
if(!pattern.exec(theStr))
{
return false;
}
return true;
}
/**
* 检测是否是字母
* @param {} inputVal
* @return {Boolean}
*/
function isLetter( inputVal )
{
if (isEmpty(inputVal))
return false;
inputVal = inputVal.toUpperCase();
var strCheck = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var i = inputVal.length;
while (i--) {
var s = inputVal.charAt( i );
var nPos = strCheck.indexOf( s );
if ( nPos < 0 )
{
return false;
}
}
return true;
}
/**
* 判断某个字符串是否为日期格式,指定的日期格式为2011-02-04.
* @param {} dateStr
* @return {Boolean}
*/
function isDate(dateStr) {
if(isEmpty(dateStr)){
return false;
}
dateStr = dateStr.replace(/\s+/g, "");
// var reg = /^[1,2][\d]{3}[\-\/]([0]{0,1}[1-9]|1[1,2])[\-\/][0,1,2,3]{0,1}[\d]$/;
var reg = /^[1,2][\d]{3}[\-]([0]{0,1}[1-9]|1[1,2])[\-][0,1,2,3]{0,1}[\d]$/;
if (!dateStr.match(reg)) {
return false;
}
var ary, d, day;
ary = dateStr.replace('/', '-').split('-');
d = new Date(ary[0], ary[1], 0);
day = parseInt(ary[2], 10);
if (day < 1 || day > d.getDate()) {
return false;
}
return true;
}
/**
* 判断是否是简单的年月,格式为201107.
* @param {} dateStr
* @return {Boolean}
*/
function isSimpleDate(dateStr) {
if(isEmpty(dateStr)){
return false;
}
dateStr = dateStr.replace(/\s+/g, "");
// var reg = /^[1,2][\d]{3}[\-\/]([0]{0,1}[1-9]|1[1,2])[\-\/][0,1,2,3]{0,1}[\d]$/;
var reg = /^[1,2][\d]{3}([0]{0,1}[1-9]|1[0,1,2])$/;
if (!dateStr.match(reg)) {
return false;
}
return true;
}
/**
* 限制文本域、文本框的字符数量,如果超过指定的数量,那么把进行字符的截取.
*
* @param field
* :我们的文本域控件
* @param maxlimit :
* 最大的字符长度
* @param countfield :
* 我们用于显示还可以输入多少个字符的文本框控件,该参数可以省略 使用示例: <form name=myform action="">
* <textarea name="message" cols="28" rows="5"
* onKeyDown="textCounter(this.form.message,10);"
* onKeyUp="textCounter(this.form.message,10);"> </textarea> 您还可以输入:<input
* name="remLen" type="text" value="100" size="5"
* readonly="readonly">个字符 </form>
*/
function textCounter(field, maxlimit, countfield) {
// 如果文本域的长度大于最大的长度,那么需要截取字符串
if (field.value.length > maxlimit) {
// 如果元素区字符数大于最大字符数,按照最大字符数截断;
field.value = field.value.substring(0, maxlimit);
} else {
if ((countfield || '') != '') {
// 在记数区文本框内显示剩余的字符数;
countfield.value = maxlimit - field.value.length;
}
}
}
//表单验证特殊符号
function vaildscript(s) {
var pattern = new RegExp(
"[`~!@#$^&*()=|{}':;'.,\\[\\].<>/?~!% @#¥……&*()——|{}【】‘;:”“'。,、?]")
var rs = "";
for ( var i = 0; i < s.length; i++) {
var rst = s.substr(i, 1).replace(pattern, '');
if (rst == "") {
return "error";
}
rs = rs + rst;
}
return rs;
}