Dojo学习笔记(十四):Dojo表单验证

本文介绍了DojoX验证工具dojox/validate的基本使用方法,包括常见验证规则和如何结合HTML表单及Dijit进行验证。dojox/validate提供了丰富的验证功能,如邮箱地址、电话号码等,并支持北美地区特定格式验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    dojox/validate是一个包含了很多通用验证逻辑的工具集,比如检查email地址的合法性,邮政编码,电话号码等等。dojox/validate在新版本中已被弃用。

    dojox/validate可以直接使用一些基本的功能:

1
2
3
4
validate.isInRange(test, options);
validate.isNumberFormat(test, options);
validate.isText(test, options);
validate.isValidLuhn(test);

    这里的每一个方法(除了isValidLuhn)都可以接受一个额外的配置参数optons,来指定额外的验证信息。比如:isNumberFormat方法可以指定数字的格式,例如:

1
var  test = validate.isNumberFormat(someNum, { format:  "(###) ###-####"  });

    格式化信息也可以以数组的方式指定,例如:

1
2
3
var  test = validate.isNumberFormat(someNum, { 
     format: [ "### ##" "###-##" "## ###"
});

    除了上面的4个方法,dojox/validate还包含了很多其他的验证规则供你使用,例如:

1
2
3
validate.creditCard
validate.isbn
validate.web

    和其他很多dojo模块不太一样,require一个validate模块不会创建新的独立对象,而是为dojox/validate模块增加更多的方法。例如,如果你的应用需要web相关的一些验证,可以用如下代码:

1
2
3
require([ "dojox/validate/web" ],  function (validate) {
     validate.isEmailAddress(someAddress);
});

    最后,还有2个模块专门用于北美和加拿大相关的格式信息:dojox/validate/us和dojox/validate/ca。这些模块提供了国家相关的电话号码,邮政编码,社保号等信息的验证。

    如果你的应用使用直接的HTML表单Form,dojox/validate提供了一个称之为check的模块,可以让你去定义一个验证逻辑的配置文件(profile),你可以用这个配置文件来确保表单中的输入值都是有效的。这个配置文件是一个javascript对象,功能相当强大,它提供了filter来过滤表单值,定义了哪些表单域是必须的,定义了表单域的相互依赖(比如一个表单域依赖于另外一个表单域),定义了值的规则,以及需要确认的表单域(例如:密码值通常要输入两遍以确认)。

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
<!DOCTYPE HTML>
<html lang= "en" >
<head>
     <meta charset= "utf-8" >
     <title>Demo: DojoX Validate and HTML Forms</title>
     <link rel= "stylesheet"  href= "dijit/themes/claro/claro.css" >    
     <style type= "text/css" >
         label  {
             display: inline-block;
             width: 140px;
         }
     </style>
</head>
<body  class = "claro" >
<h1>Demo: DojoX Validate and HTML Forms</h1>
<p style= "font-size: x-small" >
     * 是必填字段.
</p>
<form>
     <div>
         < label  for = "firstName" >First Name*</ label >
         <input type= "text"  name= "firstName"  id= "firstName"  value= ""  />
     </div>
     <div>
         < label  for = "lastName" >Last Name*</ label >
         <input type= "text"  name= "lastName"  id= "lastName"  value= ""  />
     </div>
     <div>
         < label  for = "email" >Email Address*</ label >
         <input type= "text"  name= "email"  id= "email"  value= ""  />
     </div>
     <div>
         < label  for = "emailConfirm" >Confirm Email*</ label >
         <input type= "text"  name= "emailConfirm"  id= "emailConfirm"  value= ""  />
     </div>
     <div>
         < label  for = "password" >Password*</ label >
         <input type= "password"  name= "password"  id= "password"  value= ""  />
     </div>
     <div>
         < label  for = "password2" >Confirm Password*</ label >
         <input type= "password"  name= "password2"  id= "password2"  value= ""  />
     </div>
     <div>
         < label  for = "phone" >Phone</ label >
         <input type= "text"  name= "phone"  id= "phone"  value= ""  />
     </div>
     <input type= "submit"  value= "Post!"  />
</form>
<h3>Form validation results</h3>
<div id= "result"  style= "border-top:1px solid #999;" ></div>
<!-- load dojo and provide config via data attribute -->
<script src= "dojo/dojo.js"  data-dojo-config= "async: true, parseOnLoad: true" ></script>
<script>
     require([ "dojo/dom" "dojo/_base/array" "dojo/_base/event" "dojo/query" "dojox/validate/web" "dojox/validate/us" "dojox/validate/check" "dojo/domReady!" ],  function (dom, baseArray, baseEvent, query, validate) {
         function  doCheck(form){
             var  results = validate.check(form, profile),
                     r = dom.byId( "result" );
             //通过验证
             if (results.isSuccessful()){
                 //  everything passed, log it to the result div
                 r.innerHTML =  "Everything passed validation!" ;
             else  {
                 var  s =  "" ;
                 //字段缺失
                 var  missing = results.getMissing();
                 if (missing.length){
                     s +=  '<h4>The following fields are missing:</h4>'
                     '<ol>' ;
                     baseArray.forEach(missing,  function (field){
                         s +=  '<li>'  + field +  '</li>' ;
                     });
                     s +=  '</ol>' ;
                 }
                 //输入字段无效
                 var  invalid = results.getInvalid();
                 if (invalid.length){
                     s +=  '<h4>The following fields are invalid:</h4>'
                     '<ol>' ;
                     baseArray.forEach(invalid,  function (field){
                         s +=  '<li>'  + field +  '</li>' ;
                     });
                     s +=  '</ol>' ;
                 }
 
                 r.innerHTML = s;
             }
         }
         //  wait until after our requires are actually loaded.
         profile = {
             trim: [ "firstName" "lastName" ],
             required: [ "firstName" "lastName" "email" "emailConfirm" "password" "password2" ],
             constraints: {
                 firstName:     validate.isText,
                 lastName:     validate.isText,
                 password:     validate.isText,
                 password2:     validate.isText,
                 email:      [validate.isEmailAddress,  false true ],
                 emailConfirm: [validate.isEmailAddress,  false true ],
                 phone:      validate.us.isPhoneNumber
             },
             confirm: {
                 "emailConfirm" "email" ,
                 "password2" "password"
             }
         };
 
         //  set up the form handler.
         var  f = query( "form" )[ 0 ];
         f.onsubmit =  function (e){
             baseEvent.stop(e);
             doCheck(f);
         };
     });
</script>
</body>
</html>

输出结果:

wKiom1RW7M2CQRekAAFU5QLE4is575.jpg

在基于Dijit的表单里使用dojox/validate    

    当然,你也可以结合dojox/validate和dijit一起使用,特别是dijit的ValidationTextBox。这里的关键是ValidationTextBox的validator方法。

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
<!DOCTYPE HTML>
<html lang= "en" >
<head>
     <meta charset= "utf-8" >
     <title>Demo: DojoX Validation  with  Dijit Forms</title>
     <link rel= "stylesheet"  href= "dijit/themes/claro/claro.css" >
     <script src= "dojo/dojo.js"  data-dojo-config= "async: true, parseOnLoad: true" ></script>
     <style type= "text/css" >
         label  {
             display: inline-block;
             width: 140px;
         }
     </style>
     <script>
         require([ "dojo/parser" ,
             /* dojox/ validate resources */
             "dojox/validate/us" "dojox/validate/web" ,
             /* basic dijit classes */
             "dijit/form/CheckBox" "dijit/form/Textarea" "dijit/form/FilteringSelect" "dijit/form/TextBox" "dijit/form/ValidationTextBox" "dijit/form/DateTextBox" "dijit/form/TimeTextBox" "dijit/form/Button" "dijit/form/RadioButton" "dijit/form/Form" "dijit/form/DateTextBox" ,
             /* basic dojox classes */
             "dojox/form/BusyButton" "dojox/form/CheckedMultiSelect" ,
             "dojo/domReady!" ]);
     </script>
</head>
<body  class = "claro" >
<h1>Demo: DojoX Validation  with  Dijit Forms</h1>
<p style= "font-size: x-small" >
     * 是必填字段.
</p>
<form data-dojo-type= "dijit/form/Form"  method= "post" >
     <script type= "dojo/method"  event= "onSubmit" >
if ( this .validate()){
return  confirm( 'Form is valid, press OK to submit' );
} else {
alert( 'Form contains invalid data.  Please correct first' );
return  false ;
}
return  true ;
</script>
     <div>
         < label  for = "firstName" ><strong>First Name*:</strong></ label >
         <input type= "text"  required= "true"  name= "firstName"  id= "firstName"  placeholder= "Your Name"
                data-dojo-type= "dijit/form/ValidationTextBox"  missingMessage= "Ooops!  You forgot your first name!"  />
     </div>
     <div>
         < label  for = "website" ><strong>Website*:  </strong></ label >
         <input type= "text"  required= "true"  name= "website"  id= "website"  placeholder= "Your Website"
                data-dojo-type= "dijit/form/ValidationTextBox"  validator= "dojox.validate.isUrl"  />
     </div>
     <div>
         < label  for = "email" ><strong>Email*:</strong></ label >
         <input type= "text"  required= "true"  name= "email"  id= "email"  data-dojo-type= "dijit/form/ValidationTextBox"
                validator= "dojox.validate.isEmailAddress"  />
     </div>
     <div>
         < label  for = "bday" ><strong> Date  of Birth*:</strong></ label >
         <input type= "text"  required= "true"  name= "bday"  id= "bday"  data-dojo-type= "dijit/form/DateTextBox"  value= "7/5/1983"  />
     </div>
     <div>
         < label  for = "color" ><strong>Favorite Color: </strong></ label >
         <select name= "color"  id= "color"  data-dojo-type= "dijit/form/FilteringSelect" >
             <option value= "" >Select a Color</option>
             <option value= "Red" >Red</option>
             <option value= "Green" >Green</option>
             <option value= "Blue" >Blue</option>
         </select>
     </div>
     <div>
         < label  for = "toolkits" ><strong>Favorite Toolkits: </strong></ label >
         <select name= "toolkits"  id= "toolkits"  data-dojo-type= "dojox/form/CheckedMultiSelect"   multiple= "multiple"  style= "width:200px;" >
             <option value= "Dojo"  selected= "selected" >Dojo Toolkit</option>
             <option value= "Moo"  selected= "selected" >MooTools</option>
             <option value= "Prototype" >Prototype</option>
             <option value= "YUI" >YUI</option>
             <option value= "jQuery"  disabled>jQuery</option>
         </select>
     </div>
     <div>
         < label  for = "MyCheckBox" ><strong>Send Emails?:</strong></ label >
         <input id= "MyCheckBox"  name= "MyCheckBox"  data-dojo-type= "dijit/form/CheckBox"  checked= "false"   />
     </div>
     <div>
         < label ><strong>Email Format: </strong></ label >
         <input  type= "radio"  id= "radio1"  name= "format"  checked= "checked"  data-dojo-type= "dijit/form/RadioButton"  />HTML
         &nbsp;&nbsp;&nbsp;
         <input type= "radio"  id= "radio2"  name= "format"  data-dojo-type= "dijit/form/RadioButton"  />Text
     </div>
     <input type= "submit"  value= "Submit Form"  label = "Submit Form"  id= "submitButton"  data-dojo-type= "dijit/form/Button"  />
</form>
</body>
</html>

输出结果:

wKiom1RXMUyg-wdgAAHRRifXUAw620.jpg






     本文转自stock0991 51CTO博客,原文链接:http://blog.51cto.com/qing0991/1571044,如需转载请自行联系原作者












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值