转帖,js验证
  1
*--------------- 客户端表单通用验证checkForm(oForm) -----------------
2
 * 本程序最初是由wanghr100(灰豆宝宝.net)的checkForm基础上进行修改的,增加了很多功能,如下:
3
 * 1.对非ie的支持
4
 * 2.增加了内置表达式和内置提示
5
 *  3.增加了显示方式(弹出式和页面显示式)
6
 * 4.增加了显示一条和显示全部
7
 * 5.进行了封装(CLASS_CHECK)
8
 * 6.支持外接函数或表达式(应用在密码一致)
9
 * 7.简化了调用方式,所有操作只需要<script language='javascript' src='checkform.js'>,
10
   然后在HTML里定义各标签验证格式
11
 * 8.对IE增加了对键盘输入的限制(如:定义usage='int'时,输入框只能输入数字(非IE无效)
12
 * 9.增加了对disabled的不验证
13
 * 10.自定义报警方式(重写showMessageEx方法) 
14
 *-----------------------------申明信息-----------------------------
15
 *
16
 * 作者: ttyp
17
 * 邮箱: ttyp@21cn.com
18
 * 博客: http://www.cnblogs.com/ttyp/
19
 *  声明: 对本程序可以任意复制传播,但请保留这些声明,对于内置的表达式有些没有做到很严格,如果你
20
   有好的建议和意见,欢迎邮件和我联系或者上我的博客留言
21![]()
22
 * 简介:
23
   本程序只需要对需要验证的标签设置三个属性:usage,exp,tip
24![]()
25
   usage : 内置格式或表达式或函数
26
   exp  : 正则表达式(注意如果指定了usage则忽略exp)
27
   tip  : 出错提示(如果是内置格式可以不要此属性,有缺省提示)
28![]()
29
   调用时只需要引用<script language='javascript' src='checkform.js'>,然后为每个标记
30
   增加以上3个属性(不一定需要全部)
31![]()
32
 * 原作者: wanghr100(灰豆宝宝.net)
33
 * email: wanghr100@126.com
34
 *
35
 *--------------- 客户端表单通用验证checkForm(oForm) -----------------
36
 */
37
////////////////////////////////////////////////////////////////////////////////
38![]()
39![]()
40
function CLASS_CHECK()
41
{
42
 this.pass  = true;  //是否通过验证
43
 this.showAll = true;  //是否显示所有的验证错误
44
 this.alert  = false; //报警方式(默认alert报警)
45
 this.message = "";  //错误内容
46
 this.first  = null;  //在显示全部验证错误时的第一个错误控件(用于回到焦点)
47![]()
48
 //定义内置格式
49
 var aUsage = 
50
 {
51
  "int":"^([+-]?)\\d+$",           //整数
52
  "int+":"^([+]?)\\d+$",           //正整数
53
  "int-":"^-\\d+$",            //负整数
54
  "num":"^([+-]?)\\d*\\.?\\d+$",         //数字
55
  "num+":"^([+]?)\\d*\\.?\\d+$",         //正数
56
  "num-":"^-\\d*\\.?\\d+$",          //负数
57
  "float":"^([+-]?)\\d*\\.\\d+$",         //浮点数
58
  "float+":"^([+]?)\\d*\\.\\d+$",         //正浮点数
59
  "float-":"^-\\d*\\.\\d+$",          //负浮点数
60
                  //邮件
61
  "email":"^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$", 
62
  "color":"^#[a-fA-F0-9]{6}",          //颜色
63
  "url":"^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&=]*)?$", //联接
64
  "chinese":"^[\\u4E00-\\u9FA5\\uF900-\\uFA2D]+$",    //仅中文
65
  "ascii":"^[\\x00-\\xFF]+$",          //仅ACSII字符
66
  "zipcode":"^\\d{6}$",           //邮编
67
  "mobile":"^0{0,1}13[0-9]{9}$",         //手机
68
  "ip4":"^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}.\\d{1,3}$",    //ip地址
69
  "notempty":"^\\S+$",           //非空
70
  "picture":"(.*)\\.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$", //图片
71
  "rar":"(.*)\\.(rar|zip|7zip|tgz)$",        //压缩文件
72
  "date":"^\\d{4}(\\-|\\/|\.)\\d{1,2}\\1\\d{1,2}$"        //日期
73
 };
74![]()
75
 //缺省消息
76
 var aMessage =
77
 {
78
  "int" :"请输入整数",           //整数
79
  "int+" :"请输入正整数",           //正整数
80
  "int-" :"请输入负整数",           //负整数
81
  "num" :"请输入数字",           //数字
82
  "num+" :"请输入正数",           //正数
83
  "num-" :"请输入负整数",           //负数
84
  "float" :"请输入浮点数",           //浮点数
85
  "float+":"请输入正浮点数",          //正浮点数
86
  "float-":"请输入负浮点数",          //负浮点数
87
  "email" :"请输入正确的邮箱地址",         //邮件
88
  "color" :"请输入正确的颜色",          //颜色
89
  "url" :"请输入正确的连接地址",         //联接
90
  "chinese":"请输入中文",           //中文
91
  "ascii" :"请输入ascii字符",          //仅ACSII字符
92
  "zipcode":"请输入正确的邮政编码",         //邮编
93
  "mobile":"请输入正确的手机号码",         //手机
94
  "ip4" :"请输入正确的IP地址",          //ip地址
95
  "notempty":"不能为空",           //非空
96
  "picture":"请选择图片",           //图片
97
  "rar" :"请输入压缩文件",          //压缩文件
98
  "date" :"请输入正确的日期"          //日期
99
 }
100![]()
101
 var me = this;
102![]()
103
 function checkForm(oForm)
104
 {
105
  me.pass  = true;
106
  me.message = "";
107
  me.first = null;
108
  var els = oForm.elements;
109
  //遍历所有表元素
110
  for(var i=0;i<els.length;i++)
111
  {
112
   //取得格式
113
   var sUsage = els[i].getAttribute("Usage"); 
114
   var sReg = "";
115
   
116
   //如果设置Usage,则使用内置正则表达式,忽略Exp
117
   if(typeof(sUsage)!="undefined"&&sUsage!=null)
118
   {
119
    //如果Usage在表达室里找到,则使用内置表达式,无则认为是表达式;表达式可以是函数;
120
    if(aUsage[sUsage]!=null)
121
    {   
122
     sReg = aUsage[sUsage];
123
    }
124
    else
125
    {
126
     try
127
     {
128
      if(eval(sUsage)==false)
129
      { 
130
       me.pass  = false;
131
       if(me.first==null)
132
       {
133
        me.first = els[i];
134
       }
135![]()
136
       addMessage(getMessage(els[i]));       
137![]()
138
       if(me.showAll==false)
139
       {
140
        setFocus(els[i]);
141
        break;
142
       }
143
      }
144
     }
145
     catch(e)
146
     { 
147
      alert("表达式[" + sUsage +"]错误:" + e.description)
148
      return false;
149
     }
150
    }
151
   }
152
   else
153
   {   
154
    sReg = els[i].getAttribute("Exp");
155
   }
156![]()
157
   if(typeof(sReg)!="undefined"&&sReg!=null)
158
   {
159
    //对于失效状态不验证
160
    if(isDisabled(els[i])==true)
161
    {
162
     continue;
163
    }
164![]()
165
    //取得表单的值,用通用取值函数
166
    var sVal = getValue(els[i]);
167
    //字符串->正则表达式,不区分大小写
168
    var reg = new RegExp(sReg,"i");
169
    if(!reg.test(sVal))
170
    {
171
     me.pass  = false;
172
     if(me.first==null)
173
     {
174
      me.first = els[i];
175
     }
176![]()
177
     //alert(reg);
178
     //验证不通过,弹出提示warning
179
     var sTip = getMessage(els[i]);
180
     if(sTip.length==0&&typeof(sUsage)!="undefined"&&sUsage!=null&&aMessage[sUsage]!=null)
181
     {
182
      sTip = aMessage[sUsage];
183
     }
184
     addMessage(sTip);
185![]()
186
     if(me.showAll==false)
187
     {
188
      //该表单元素取得焦点,用通用返回函数
189
      setFocus(els[i]);
190
      break;
191
     }
192![]()
193
    }
194
   }        
195
  }
196![]()
197
  if(me.pass==false)
198
  {
199
   showMessage();
200![]()
201
   if(me.first!=null&&me.showAll==true)
202
   {
203
    setFocus(me.first);
204
   }
205
  }
206![]()
207
  return me.pass;
208
 }
209![]()
210
 /*
211
  * 添加错误信息
212
  */
213
 function addMessage(msg)
214
 {
215
  if(me.alert==true)
216
  {
217
   me.message += msg + "\n";
218
  }
219
  else
220
  {
221
   me.message += msg + "<br>";
222
  }
223
 }
224![]()
225
 /*
226
  * 显示错误
227
  */
228
 function getMessage(els)
229
 {
230
  var sTip = els.getAttribute("tip");
231
  if(typeof(sTip)!="undefined"&&sTip!=null)
232
  {
233
   return sTip;
234
  }
235
  else
236
  {
237
   return "";
238
  }
239
 }
240![]()
241![]()
242
 /*
243
  * 显示错误
244
  */
245
 function showMessage()
246
 {
247
  //外接显示错误函数
248
  if(typeof(me.showMessageEx)=="function")
249
  {
250
   return me.showMessageEx(me.message);
251
  }
252![]()
253
  if(me.alert==true)
254
  {
255
   alert(me.message);
256
  }
257
  else
258
  {
259
   var divTip;
260
    divTip = document.getElementById("divErrorMessage");
261
   try
262
   {
263
    if(typeof(divTip)=="undefined"||divTip==null)
264
    {
265
      divTip = document.createElement("div");
266
      divTip.id   = "divErrorMessage";
267
      divTip.name   = "divErrorMessage";
268
      divTip.style.color = "red";
269
      document.body.appendChild(divTip);
270
    }
271![]()
272
    divTip.innerHTML = me.message;
273
   }catch(e){}
274
  }
275
 }
276![]()
277
 /*
278
  * 获得元素是否失效(失效的元素不做判断)
279
  */
280
 function isDisabled(el)
281
 {
282
  //对于radio,checkbox元素,只要其中有一个非失效元素就验证
283
  if(el.type=="radio"||el.type=="checkbox")
284
  {
285
   //取得第一个元素的name,搜索这个元素组
286
   var tmpels = document.getElementsByName(el.name);
287
   for(var i=0;i<tmpels.length;i++)
288
   {
289
    if(tmpels[i].disabled==false)
290
    {
291
     return false;
292
    }
293
   }
294
   return true;
295
  }
296
  else
297
  {
298
   return el.disabled;
299
  }
300
 }
301![]()
302![]()
303
 /*
304
  * 取得对象的值(对于单选多选框把其选择的个数作为需要验证的值)
305
  */
306
 function getValue(el)
307
 {
308
  //取得表单元素的类型
309
  var sType = el.type;
310
  switch(sType)
311
  {
312
   //文本输入框,直接取值el.value
313
   case "text":
314
   case "hidden":
315
   case "password":
316
   case "file":
317
   case "textarea": return el.value;
318
   //单多下拉菜单,遍历所有选项取得被选中的个数返回结果"0"表示选中一个,"00"表示选中两个
319
   case "checkbox":
320
   case "radio": return getRadioValue(el);
321
   case "select-one":
322
   case "select-multiple": return getSelectValue(el);
323
  }
324
  //取得radio,checkbox的选中数,用"0"来表示选中的个数,我们写正则的时候就可以通过0{1,}来表示选中个数
325
  function getRadioValue(el)
326
  {
327
   var sValue = "";
328
   //取得第一个元素的name,搜索这个元素组
329
   var tmpels = document.getElementsByName(el.name);
330
   for(var i=0;i<tmpels.length;i++)
331
   {
332
    if(tmpels[i].checked)
333
    {
334
     sValue += "0";
335
    }
336
   }
337
   return sValue;
338
  }
339
  //取得select的选中数,用"0"来表示选中的个数,我们写正则的时候就可以通过0{1,}来表示选中个数
340
  function getSelectValue(el)
341
  {
342
   var sValue = "";
343
   for(var i=0;i<el.options.length;i++)
344
   {
345
    //单选下拉框提示选项设置为value=""
346
    if(el.options[i].selected && el.options[i].value!="")
347
    {
348
     sValue += "0";
349
    }
350
   }
351
   return sValue;
352
  }
353
 }
354![]()
355
 /*
356
  * 对没有通过验证的元素设置焦点
357
  */
358
 function setFocus(el)
359
 {
360
  //取得表单元素的类型
361
  var sType = el.type;
362
  switch(sType)
363
  {
364
   //文本输入框,光标定位在文本输入框的末尾
365
   case "text":
366
   case "hidden":
367
   case "password":
368
   case "file":
369
   case "textarea": 
370
    try{el.focus();var rng = el.createTextRange(); rng.collapse(false); rng.select();}catch(e){};
371
    break;
372
   
373
   //单多选,第一选项非失效控件取得焦点
374
   case "checkbox":
375
   case "radio": 
376
    var els = document.getElementsByName(el.name);
377
    for(var i=0;i<els.length;i++)
378
    {
379
     if(els[i].disabled == false)
380
     {
381
      els[i].focus();
382
      break;
383
     }
384
    }
385
    break;
386
   case "select-one":
387
   case "select-multiple":
388
    el.focus();
389
    break;
390
  }
391
 }
392![]()
393
 
394
 //自动绑定到所有form的onsubmit事件
395
 if(window.attachEvent)
396
 {
397
  window.attachEvent("onload",function(){for(var i=0;i<document.forms.length;i++){var theFrom = document.forms[i]; if(theFrom){theFrom.attachEvent("onsubmit",function(){return checkForm(theFrom);});}}});
398
 }
399
 else
400
 {
401
  window.onsubmit = function(e){var theFrom = e.target;if(theFrom){return checkForm(theFrom);}}
402
 }
403![]()
404
 this.keyCheck = function()
405
 {
406
  if(window.attachEvent)
407
  {
408
   window.attachEvent("onload",function(){for(var i=0;i<document.forms.length;i++){var theFrom = document.forms[i]; if(theFrom){myKeyCheck(theFrom);}}});
409
  }
410
  else
411
  {
412
   //TOOD
413
  }
414![]()
415
  function myKeyCheck(oForm)
416
  {
417
   var els = oForm.elements;
418
   //遍历所有表元素
419
   for(var i=0;i<els.length;i++)
420
   {
421
    //取得格式
422
    var sUsage = els[i].getAttribute("Usage"); 
423
    
424
    //如果设置Usage,则使用内置正则表达式,忽略Exp
425
    if(typeof(sUsage)!="undefined"&&sUsage!=null)
426
    {
427
     switch(sUsage.toLowerCase ())
428
     {
429
      case "zipcode":
430
      case "int":
431
       els[i].onkeypress = function(){return /\d/.test(String.fromCharCode(event.keyCode))||(this.value.indexOf('+')<0?String.fromCharCode(event.keyCode)=="+":false)||(this.value.indexOf('-')<0?String.fromCharCode(event.keyCode)=="-":false);}
432
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(/\D/);}
433
       els[i].ondragenter = function(){return false;}
434
       els[i].style.imeMode= "disabled";
435
       break;
436
      case "mobile":
437
      case "int+":
438
       els[i].onkeypress = function(){return /\d/.test(String.fromCharCode(event.keyCode))||(this.value.indexOf('+')<0?String.fromCharCode(event.keyCode)=="+":false);}
439
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(/\D/);}
440
       els[i].ondragenter = function(){return false;}
441
       els[i].style.imeMode= "disabled";
442
       break;
443
      case "int-":
444
       els[i].onkeypress = function(){return /\d/.test(String.fromCharCode(event.keyCode))||(this.value.indexOf('-')<0?String.fromCharCode(event.keyCode)=="-":false);}     
445
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(/\D/);}
446
       els[i].ondragenter = function(){return false;}
447
       els[i].style.imeMode= "disabled";
448
       break;
449
      case "float":
450
      case "num":
451
       els[i].onkeypress = function(){return /[\+\-\.]|\d/.test(String.fromCharCode(event.keyCode));}     
452
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(/\D/);}
453
       els[i].ondragenter = function(){return false;}
454
       els[i].style.imeMode= "disabled";
455
       break;
456
      case "float+":
457
      case "num+":
458
       els[i].onkeypress = function(){return /[\+\.]|\d/.test(String.fromCharCode(event.keyCode));}     
459
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(/\D/);}
460
       els[i].ondragenter = function(){return false;}
461
       els[i].style.imeMode= "disabled";
462
       break;
463
      case "float-":
464
      case "num-":
465
       els[i].onkeypress = function(){return /[\-\.]|\d/.test(String.fromCharCode(event.keyCode));}     
466
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(/\D/);}
467
       els[i].ondragenter = function(){return false;}
468
       els[i].style.imeMode= "disabled";
469
       break;
470
      case "ascii":
471
       els[i].style.imeMode= "disabled";
472
       break;
473
      case "ip4":
474
       els[i].onkeypress = function(){return /[\.]|\d/.test(String.fromCharCode(event.keyCode));}     
475
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(/\D/);}
476
       els[i].ondragenter = function(){return false;}
477
       els[i].style.imeMode= "disabled";
478
       els[i].maxLength = 15;
479
       break;
480
      case "color":
481
       els[i].onkeypress = function(){return /[a-fA-Z]|\d/.test(String.fromCharCode(event.keyCode))||(this.value.indexOf('#')<0?String.fromCharCode(event.keyCode)=="#":false);}     
482
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(/\D/);}
483
       els[i].ondragenter = function(){return false;}
484
       els[i].maxLength = 7;
485
       els[i].style.imeMode= "disabled";
486
       break;
487
      case "date":
488
       els[i].onkeypress = function(){return /[\/\-\.]|\d/.test(String.fromCharCode(event.keyCode));}     
489
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(/\D/);}
490
       els[i].ondragenter = function(){return false;}
491
       els[i].style.imeMode= "disabled";
492
       break;       
493
     }
494
    }
495
   }
496
  }
497
 }
498
}
499![]()
500
//初始化
501
var g_check = new CLASS_CHECK();
502
 g_check.keyCheck();
503![]()
504![]()
505![]()
 
*--------------- 客户端表单通用验证checkForm(oForm) -----------------2
 * 本程序最初是由wanghr100(灰豆宝宝.net)的checkForm基础上进行修改的,增加了很多功能,如下:3
 * 1.对非ie的支持4
 * 2.增加了内置表达式和内置提示5
 *  3.增加了显示方式(弹出式和页面显示式)6
 * 4.增加了显示一条和显示全部7
 * 5.进行了封装(CLASS_CHECK)8
 * 6.支持外接函数或表达式(应用在密码一致)9
 * 7.简化了调用方式,所有操作只需要<script language='javascript' src='checkform.js'>,10
   然后在HTML里定义各标签验证格式11
 * 8.对IE增加了对键盘输入的限制(如:定义usage='int'时,输入框只能输入数字(非IE无效)12
 * 9.增加了对disabled的不验证13
 * 10.自定义报警方式(重写showMessageEx方法) 14
 *-----------------------------申明信息-----------------------------15
 *16
 * 作者: ttyp17
 * 邮箱: ttyp@21cn.com18
 * 博客: http://www.cnblogs.com/ttyp/19
 *  声明: 对本程序可以任意复制传播,但请保留这些声明,对于内置的表达式有些没有做到很严格,如果你20
   有好的建议和意见,欢迎邮件和我联系或者上我的博客留言21

22
 * 简介:23
   本程序只需要对需要验证的标签设置三个属性:usage,exp,tip24

25
   usage : 内置格式或表达式或函数26
   exp  : 正则表达式(注意如果指定了usage则忽略exp)27
   tip  : 出错提示(如果是内置格式可以不要此属性,有缺省提示)28

29
   调用时只需要引用<script language='javascript' src='checkform.js'>,然后为每个标记30
   增加以上3个属性(不一定需要全部)31

32
 * 原作者: wanghr100(灰豆宝宝.net)33
 * email: wanghr100@126.com34
 *35
 *--------------- 客户端表单通用验证checkForm(oForm) -----------------36
 */37
////////////////////////////////////////////////////////////////////////////////38

39

40
function CLASS_CHECK()41
{42
 this.pass  = true;  //是否通过验证43
 this.showAll = true;  //是否显示所有的验证错误44
 this.alert  = false; //报警方式(默认alert报警)45
 this.message = "";  //错误内容46
 this.first  = null;  //在显示全部验证错误时的第一个错误控件(用于回到焦点)47

48
 //定义内置格式49
 var aUsage = 50
 {51
  "int":"^([+-]?)\\d+$",           //整数52
  "int+":"^([+]?)\\d+$",           //正整数53
  "int-":"^-\\d+$",            //负整数54
  "num":"^([+-]?)\\d*\\.?\\d+$",         //数字55
  "num+":"^([+]?)\\d*\\.?\\d+$",         //正数56
  "num-":"^-\\d*\\.?\\d+$",          //负数57
  "float":"^([+-]?)\\d*\\.\\d+$",         //浮点数58
  "float+":"^([+]?)\\d*\\.\\d+$",         //正浮点数59
  "float-":"^-\\d*\\.\\d+$",          //负浮点数60
                  //邮件61
  "email":"^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$", 62
  "color":"^#[a-fA-F0-9]{6}",          //颜色63
  "url":"^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&=]*)?$", //联接64
  "chinese":"^[\\u4E00-\\u9FA5\\uF900-\\uFA2D]+$",    //仅中文65
  "ascii":"^[\\x00-\\xFF]+$",          //仅ACSII字符66
  "zipcode":"^\\d{6}$",           //邮编67
  "mobile":"^0{0,1}13[0-9]{9}$",         //手机68
  "ip4":"^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}.\\d{1,3}$",    //ip地址69
  "notempty":"^\\S+$",           //非空70
  "picture":"(.*)\\.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$", //图片71
  "rar":"(.*)\\.(rar|zip|7zip|tgz)$",        //压缩文件72
  "date":"^\\d{4}(\\-|\\/|\.)\\d{1,2}\\1\\d{1,2}$"        //日期73
 };74

75
 //缺省消息76
 var aMessage =77
 {78
  "int" :"请输入整数",           //整数79
  "int+" :"请输入正整数",           //正整数80
  "int-" :"请输入负整数",           //负整数81
  "num" :"请输入数字",           //数字82
  "num+" :"请输入正数",           //正数83
  "num-" :"请输入负整数",           //负数84
  "float" :"请输入浮点数",           //浮点数85
  "float+":"请输入正浮点数",          //正浮点数86
  "float-":"请输入负浮点数",          //负浮点数87
  "email" :"请输入正确的邮箱地址",         //邮件88
  "color" :"请输入正确的颜色",          //颜色89
  "url" :"请输入正确的连接地址",         //联接90
  "chinese":"请输入中文",           //中文91
  "ascii" :"请输入ascii字符",          //仅ACSII字符92
  "zipcode":"请输入正确的邮政编码",         //邮编93
  "mobile":"请输入正确的手机号码",         //手机94
  "ip4" :"请输入正确的IP地址",          //ip地址95
  "notempty":"不能为空",           //非空96
  "picture":"请选择图片",           //图片97
  "rar" :"请输入压缩文件",          //压缩文件98
  "date" :"请输入正确的日期"          //日期99
 }100

101
 var me = this;102

103
 function checkForm(oForm)104
 {105
  me.pass  = true;106
  me.message = "";107
  me.first = null;108
  var els = oForm.elements;109
  //遍历所有表元素110
  for(var i=0;i<els.length;i++)111
  {112
   //取得格式113
   var sUsage = els[i].getAttribute("Usage"); 114
   var sReg = "";115
   116
   //如果设置Usage,则使用内置正则表达式,忽略Exp117
   if(typeof(sUsage)!="undefined"&&sUsage!=null)118
   {119
    //如果Usage在表达室里找到,则使用内置表达式,无则认为是表达式;表达式可以是函数;120
    if(aUsage[sUsage]!=null)121
    {   122
     sReg = aUsage[sUsage];123
    }124
    else125
    {126
     try127
     {128
      if(eval(sUsage)==false)129
      { 130
       me.pass  = false;131
       if(me.first==null)132
       {133
        me.first = els[i];134
       }135

136
       addMessage(getMessage(els[i]));       137

138
       if(me.showAll==false)139
       {140
        setFocus(els[i]);141
        break;142
       }143
      }144
     }145
     catch(e)146
     { 147
      alert("表达式[" + sUsage +"]错误:" + e.description)148
      return false;149
     }150
    }151
   }152
   else153
   {   154
    sReg = els[i].getAttribute("Exp");155
   }156

157
   if(typeof(sReg)!="undefined"&&sReg!=null)158
   {159
    //对于失效状态不验证160
    if(isDisabled(els[i])==true)161
    {162
     continue;163
    }164

165
    //取得表单的值,用通用取值函数166
    var sVal = getValue(els[i]);167
    //字符串->正则表达式,不区分大小写168
    var reg = new RegExp(sReg,"i");169
    if(!reg.test(sVal))170
    {171
     me.pass  = false;172
     if(me.first==null)173
     {174
      me.first = els[i];175
     }176

177
     //alert(reg);178
     //验证不通过,弹出提示warning179
     var sTip = getMessage(els[i]);180
     if(sTip.length==0&&typeof(sUsage)!="undefined"&&sUsage!=null&&aMessage[sUsage]!=null)181
     {182
      sTip = aMessage[sUsage];183
     }184
     addMessage(sTip);185

186
     if(me.showAll==false)187
     {188
      //该表单元素取得焦点,用通用返回函数189
      setFocus(els[i]);190
      break;191
     }192

193
    }194
   }        195
  }196

197
  if(me.pass==false)198
  {199
   showMessage();200

201
   if(me.first!=null&&me.showAll==true)202
   {203
    setFocus(me.first);204
   }205
  }206

207
  return me.pass;208
 }209

210
 /*211
  * 添加错误信息212
  */213
 function addMessage(msg)214
 {215
  if(me.alert==true)216
  {217
   me.message += msg + "\n";218
  }219
  else220
  {221
   me.message += msg + "<br>";222
  }223
 }224

225
 /*226
  * 显示错误227
  */228
 function getMessage(els)229
 {230
  var sTip = els.getAttribute("tip");231
  if(typeof(sTip)!="undefined"&&sTip!=null)232
  {233
   return sTip;234
  }235
  else236
  {237
   return "";238
  }239
 }240

241

242
 /*243
  * 显示错误244
  */245
 function showMessage()246
 {247
  //外接显示错误函数248
  if(typeof(me.showMessageEx)=="function")249
  {250
   return me.showMessageEx(me.message);251
  }252

253
  if(me.alert==true)254
  {255
   alert(me.message);256
  }257
  else258
  {259
   var divTip;260
    divTip = document.getElementById("divErrorMessage");261
   try262
   {263
    if(typeof(divTip)=="undefined"||divTip==null)264
    {265
      divTip = document.createElement("div");266
      divTip.id   = "divErrorMessage";267
      divTip.name   = "divErrorMessage";268
      divTip.style.color = "red";269
      document.body.appendChild(divTip);270
    }271

272
    divTip.innerHTML = me.message;273
   }catch(e){}274
  }275
 }276

277
 /*278
  * 获得元素是否失效(失效的元素不做判断)279
  */280
 function isDisabled(el)281
 {282
  //对于radio,checkbox元素,只要其中有一个非失效元素就验证283
  if(el.type=="radio"||el.type=="checkbox")284
  {285
   //取得第一个元素的name,搜索这个元素组286
   var tmpels = document.getElementsByName(el.name);287
   for(var i=0;i<tmpels.length;i++)288
   {289
    if(tmpels[i].disabled==false)290
    {291
     return false;292
    }293
   }294
   return true;295
  }296
  else297
  {298
   return el.disabled;299
  }300
 }301

302

303
 /*304
  * 取得对象的值(对于单选多选框把其选择的个数作为需要验证的值)305
  */306
 function getValue(el)307
 {308
  //取得表单元素的类型309
  var sType = el.type;310
  switch(sType)311
  {312
   //文本输入框,直接取值el.value313
   case "text":314
   case "hidden":315
   case "password":316
   case "file":317
   case "textarea": return el.value;318
   //单多下拉菜单,遍历所有选项取得被选中的个数返回结果"0"表示选中一个,"00"表示选中两个319
   case "checkbox":320
   case "radio": return getRadioValue(el);321
   case "select-one":322
   case "select-multiple": return getSelectValue(el);323
  }324
  //取得radio,checkbox的选中数,用"0"来表示选中的个数,我们写正则的时候就可以通过0{1,}来表示选中个数325
  function getRadioValue(el)326
  {327
   var sValue = "";328
   //取得第一个元素的name,搜索这个元素组329
   var tmpels = document.getElementsByName(el.name);330
   for(var i=0;i<tmpels.length;i++)331
   {332
    if(tmpels[i].checked)333
    {334
     sValue += "0";335
    }336
   }337
   return sValue;338
  }339
  //取得select的选中数,用"0"来表示选中的个数,我们写正则的时候就可以通过0{1,}来表示选中个数340
  function getSelectValue(el)341
  {342
   var sValue = "";343
   for(var i=0;i<el.options.length;i++)344
   {345
    //单选下拉框提示选项设置为value=""346
    if(el.options[i].selected && el.options[i].value!="")347
    {348
     sValue += "0";349
    }350
   }351
   return sValue;352
  }353
 }354

355
 /*356
  * 对没有通过验证的元素设置焦点357
  */358
 function setFocus(el)359
 {360
  //取得表单元素的类型361
  var sType = el.type;362
  switch(sType)363
  {364
   //文本输入框,光标定位在文本输入框的末尾365
   case "text":366
   case "hidden":367
   case "password":368
   case "file":369
   case "textarea": 370
    try{el.focus();var rng = el.createTextRange(); rng.collapse(false); rng.select();}catch(e){};371
    break;372
   373
   //单多选,第一选项非失效控件取得焦点374
   case "checkbox":375
   case "radio": 376
    var els = document.getElementsByName(el.name);377
    for(var i=0;i<els.length;i++)378
    {379
     if(els[i].disabled == false)380
     {381
      els[i].focus();382
      break;383
     }384
    }385
    break;386
   case "select-one":387
   case "select-multiple":388
    el.focus();389
    break;390
  }391
 }392

393
 394
 //自动绑定到所有form的onsubmit事件395
 if(window.attachEvent)396
 {397
  window.attachEvent("onload",function(){for(var i=0;i<document.forms.length;i++){var theFrom = document.forms[i]; if(theFrom){theFrom.attachEvent("onsubmit",function(){return checkForm(theFrom);});}}});398
 }399
 else400
 {401
  window.onsubmit = function(e){var theFrom = e.target;if(theFrom){return checkForm(theFrom);}}402
 }403

404
 this.keyCheck = function()405
 {406
  if(window.attachEvent)407
  {408
   window.attachEvent("onload",function(){for(var i=0;i<document.forms.length;i++){var theFrom = document.forms[i]; if(theFrom){myKeyCheck(theFrom);}}});409
  }410
  else411
  {412
   //TOOD413
  }414

415
  function myKeyCheck(oForm)416
  {417
   var els = oForm.elements;418
   //遍历所有表元素419
   for(var i=0;i<els.length;i++)420
   {421
    //取得格式422
    var sUsage = els[i].getAttribute("Usage"); 423
    424
    //如果设置Usage,则使用内置正则表达式,忽略Exp425
    if(typeof(sUsage)!="undefined"&&sUsage!=null)426
    {427
     switch(sUsage.toLowerCase ())428
     {429
      case "zipcode":430
      case "int":431
       els[i].onkeypress = function(){return /\d/.test(String.fromCharCode(event.keyCode))||(this.value.indexOf('+')<0?String.fromCharCode(event.keyCode)=="+":false)||(this.value.indexOf('-')<0?String.fromCharCode(event.keyCode)=="-":false);}432
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(/\D/);}433
       els[i].ondragenter = function(){return false;}434
       els[i].style.imeMode= "disabled";435
       break;436
      case "mobile":437
      case "int+":438
       els[i].onkeypress = function(){return /\d/.test(String.fromCharCode(event.keyCode))||(this.value.indexOf('+')<0?String.fromCharCode(event.keyCode)=="+":false);}439
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(/\D/);}440
       els[i].ondragenter = function(){return false;}441
       els[i].style.imeMode= "disabled";442
       break;443
      case "int-":444
       els[i].onkeypress = function(){return /\d/.test(String.fromCharCode(event.keyCode))||(this.value.indexOf('-')<0?String.fromCharCode(event.keyCode)=="-":false);}     445
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(/\D/);}446
       els[i].ondragenter = function(){return false;}447
       els[i].style.imeMode= "disabled";448
       break;449
      case "float":450
      case "num":451
       els[i].onkeypress = function(){return /[\+\-\.]|\d/.test(String.fromCharCode(event.keyCode));}     452
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(/\D/);}453
       els[i].ondragenter = function(){return false;}454
       els[i].style.imeMode= "disabled";455
       break;456
      case "float+":457
      case "num+":458
       els[i].onkeypress = function(){return /[\+\.]|\d/.test(String.fromCharCode(event.keyCode));}     459
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(/\D/);}460
       els[i].ondragenter = function(){return false;}461
       els[i].style.imeMode= "disabled";462
       break;463
      case "float-":464
      case "num-":465
       els[i].onkeypress = function(){return /[\-\.]|\d/.test(String.fromCharCode(event.keyCode));}     466
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(/\D/);}467
       els[i].ondragenter = function(){return false;}468
       els[i].style.imeMode= "disabled";469
       break;470
      case "ascii":471
       els[i].style.imeMode= "disabled";472
       break;473
      case "ip4":474
       els[i].onkeypress = function(){return /[\.]|\d/.test(String.fromCharCode(event.keyCode));}     475
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(/\D/);}476
       els[i].ondragenter = function(){return false;}477
       els[i].style.imeMode= "disabled";478
       els[i].maxLength = 15;479
       break;480
      case "color":481
       els[i].onkeypress = function(){return /[a-fA-Z]|\d/.test(String.fromCharCode(event.keyCode))||(this.value.indexOf('#')<0?String.fromCharCode(event.keyCode)=="#":false);}     482
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(/\D/);}483
       els[i].ondragenter = function(){return false;}484
       els[i].maxLength = 7;485
       els[i].style.imeMode= "disabled";486
       break;487
      case "date":488
       els[i].onkeypress = function(){return /[\/\-\.]|\d/.test(String.fromCharCode(event.keyCode));}     489
       els[i].onpaste  = function(){return !clipboardData.getData('text').match(/\D/);}490
       els[i].ondragenter = function(){return false;}491
       els[i].style.imeMode= "disabled";492
       break;       493
     }494
    }495
   }496
  }497
 }498
}499

500
//初始化501
var g_check = new CLASS_CHECK();502
 g_check.keyCheck();503

504

505

                    
                


 
                
            
        
浙公网安备 33010602011771号