客户端验证的极品--jQuery.validator(转)
最近在做一个用户注册登录的页面,资料查寻过程中发现了一个非常不错的客户端验证的极品-jQuery.validate。
它是著名的JavaScript包jQuery的一个插件,其实它还有其它的一些插件应该都爽,有待慢慢来学习
官方地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation/
jQuery用户手册:http://jquery.org.cn/visual/cn/index.xml
开发使用起来非常简单明了,
我的代码:
1
. $(document).ready(
function
(){
2 .
3 . /* 设置默认属性 */
4 . $.validator.setDefaults({
5 . submitHandler: function (form) { form.submit(); }
6 . });
7 . // 中文字两个字节
8 . jQuery.validator.addMethod( " byteRangeLength " , function (value, element, param) {
9 . var length = value.length;
10 . for ( var i = 0 ; i < value.length; i ++ ){
11 . if (value.charCodeAt(i) > 127 ){
12 . length ++ ;
13 . }
14 . }
15 . return this .optional(element) || ( length >= param[ 0 ] && length <= param[ 1 ] );
16 . }, " 请确保输入的值在3-15个字节之间(一个中文字算2个字节) " );
17 .
18 . /* 追加自定义验证方法 */
19 . // 身份证号码验证
20 . jQuery.validator.addMethod( " isIdCardNo " , function (value, element) {
21 . return this .optional(element) || isIdCardNo(value);
22 . }, " 请正确输入您的身份证号码 " );
23 .
24 . // 字符验证
25 . jQuery.validator.addMethod( " userName " , function (value, element) {
26 . return this .optional(element) || /^ [\u0391 - \uFFE5\w] + $ / .test(value);
27 . }, " 用户名只能包括中文字、英文字母、数字和下划线 " );
28 .
29 . // 手机号码验证
30 . jQuery.validator.addMethod( " isMobile " , function (value, element) {
31 . var length = value.length;
32 . return this .optional(element) || (length == 11 && /^ ((( 13 [ 0 - 9 ]{ 1 }) | ( 15 [ 0 - 9 ]{ 1 })) + \d{ 8 })$ / .test(value));
33 . }, " 请正确填写您的手机号码 " );
34 .
35 . // 电话号码验证
36 . jQuery.validator.addMethod( " isPhone " , function (value, element) {
37 . var tel = /^ (\d{ 3 , 4 } -? ) ? \d{ 7 , 9 }$ / g;
38 . return this .optional(element) || (tel.test(value));
39 . }, " 请正确填写您的电话号码 " );
40 .
41 . // 邮政编码验证
42 . jQuery.validator.addMethod( " isZipCode " , function (value, element) {
43 . var tel = /^ [ 0 - 9 ]{ 6 }$ / ;
44 . return this .optional(element) || (tel.test(value));
45 . }, " 请正确填写您的邮政编码 " );
46 . $(regFrom).validate({
47 . /* 设置验证规则 */
48 . rules: {
49 . userName: {
50 . required: true ,
51 . userName: true ,
52 . byteRangeLength: [ 3 , 15 ]
53 . },
54 . password: {
55 . required: true ,
56 . minLength: 5
57 . },
58 . repassword: {
59 . required: true ,
60 . minLength: 5 ,
61 . equalTo: " #password "
62 . },
63 . question: {
64 . required: true
65 . },
66 . answer: {
67 . required: true
68 . },
69 . realName: {
70 . required: true
71 . },
72 . cardNumber: {
73 . isIdCardNo: true
74 . },
75 . mobilePhone: {
76 . isMobile: true
77 . },
78 . phone: {
79 . isPhone: true
80 . },
81 . email: {
82 . required: true ,
83 . email: true
84 . },
85 . zipCode: {
86 . isZipCode: true
87 . }
88 . },
89 . /* 设置错误信息 */
90 . messages: {
91 . userName: {
92 . required: " 请填写用户名 " ,
93 . byteRangeLength: " 用户名必须在3-15个字符之间(一个中文字算2个字符) "
94 . },
95 . password: {
96 . required: " 请填写密码 " ,
97 . minlength: jQuery.format( " 输入{0}. " )
98 . },
99 . repassword: {
100 . required: " 请填写确认密码 " ,
101 . equalTo: " 两次密码输入不相同 "
102 . },
103 . question: {
104 . required: " 请填写您的密码提示问题 "
105 . },
106 . answer: {
107 . required: " 请填写您的密码提示答案 "
108 . },
109 . realName: {
110 . required: " 请填写您的真实姓名 "
111 . },
112 . email: {
113 . required: " 请输入一个Email地址 " ,
114 . email: " 请输入一个有效的Email地址 "
115 . }
116 . },
117 . /* 错误信息的显示位置 */
118 . errorPlacement: function (error, element) {
119 . error.appendTo( element.parent() );
120 . },
121 . /* 验证通过时的处理 */
122 . success: function (label) {
123 . // set as text for IE
124 . label.html( " " ).addClass( " checked " );
125 . },
126 . /* 获得焦点时不验证 */
127 . focusInvalid: false ,
128 . onkeyup: false
129 . });
130 .
131 . // 输入框获得焦点时,样式设置
132 . $('input').focus( function (){
133 . if ($( this ).is( " :text " ) || $( this ).is( " :password " ))
134 . $( this ).addClass('focus');
135 . if ($( this ).hasClass('have_tooltip')) {
136 . $( this ).parent().parent().removeClass('field_normal').addClass('field_focus');
137 . }
138 . });
139 .
140 . // 输入框失去焦点时,样式设置
141 . $('input').blur( function () {
142 . $( this ).removeClass('focus');
143 . if ($( this ).hasClass('have_tooltip')) {
144 . $( this ).parent().parent().removeClass('field_focus').addClass('field_normal');
145 . }
146 . });
147 . });
2 .
3 . /* 设置默认属性 */
4 . $.validator.setDefaults({
5 . submitHandler: function (form) { form.submit(); }
6 . });
7 . // 中文字两个字节
8 . jQuery.validator.addMethod( " byteRangeLength " , function (value, element, param) {
9 . var length = value.length;
10 . for ( var i = 0 ; i < value.length; i ++ ){
11 . if (value.charCodeAt(i) > 127 ){
12 . length ++ ;
13 . }
14 . }
15 . return this .optional(element) || ( length >= param[ 0 ] && length <= param[ 1 ] );
16 . }, " 请确保输入的值在3-15个字节之间(一个中文字算2个字节) " );
17 .
18 . /* 追加自定义验证方法 */
19 . // 身份证号码验证
20 . jQuery.validator.addMethod( " isIdCardNo " , function (value, element) {
21 . return this .optional(element) || isIdCardNo(value);
22 . }, " 请正确输入您的身份证号码 " );
23 .
24 . // 字符验证
25 . jQuery.validator.addMethod( " userName " , function (value, element) {
26 . return this .optional(element) || /^ [\u0391 - \uFFE5\w] + $ / .test(value);
27 . }, " 用户名只能包括中文字、英文字母、数字和下划线 " );
28 .
29 . // 手机号码验证
30 . jQuery.validator.addMethod( " isMobile " , function (value, element) {
31 . var length = value.length;
32 . return this .optional(element) || (length == 11 && /^ ((( 13 [ 0 - 9 ]{ 1 }) | ( 15 [ 0 - 9 ]{ 1 })) + \d{ 8 })$ / .test(value));
33 . }, " 请正确填写您的手机号码 " );
34 .
35 . // 电话号码验证
36 . jQuery.validator.addMethod( " isPhone " , function (value, element) {
37 . var tel = /^ (\d{ 3 , 4 } -? ) ? \d{ 7 , 9 }$ / g;
38 . return this .optional(element) || (tel.test(value));
39 . }, " 请正确填写您的电话号码 " );
40 .
41 . // 邮政编码验证
42 . jQuery.validator.addMethod( " isZipCode " , function (value, element) {
43 . var tel = /^ [ 0 - 9 ]{ 6 }$ / ;
44 . return this .optional(element) || (tel.test(value));
45 . }, " 请正确填写您的邮政编码 " );
46 . $(regFrom).validate({
47 . /* 设置验证规则 */
48 . rules: {
49 . userName: {
50 . required: true ,
51 . userName: true ,
52 . byteRangeLength: [ 3 , 15 ]
53 . },
54 . password: {
55 . required: true ,
56 . minLength: 5
57 . },
58 . repassword: {
59 . required: true ,
60 . minLength: 5 ,
61 . equalTo: " #password "
62 . },
63 . question: {
64 . required: true
65 . },
66 . answer: {
67 . required: true
68 . },
69 . realName: {
70 . required: true
71 . },
72 . cardNumber: {
73 . isIdCardNo: true
74 . },
75 . mobilePhone: {
76 . isMobile: true
77 . },
78 . phone: {
79 . isPhone: true
80 . },
81 . email: {
82 . required: true ,
83 . email: true
84 . },
85 . zipCode: {
86 . isZipCode: true
87 . }
88 . },
89 . /* 设置错误信息 */
90 . messages: {
91 . userName: {
92 . required: " 请填写用户名 " ,
93 . byteRangeLength: " 用户名必须在3-15个字符之间(一个中文字算2个字符) "
94 . },
95 . password: {
96 . required: " 请填写密码 " ,
97 . minlength: jQuery.format( " 输入{0}. " )
98 . },
99 . repassword: {
100 . required: " 请填写确认密码 " ,
101 . equalTo: " 两次密码输入不相同 "
102 . },
103 . question: {
104 . required: " 请填写您的密码提示问题 "
105 . },
106 . answer: {
107 . required: " 请填写您的密码提示答案 "
108 . },
109 . realName: {
110 . required: " 请填写您的真实姓名 "
111 . },
112 . email: {
113 . required: " 请输入一个Email地址 " ,
114 . email: " 请输入一个有效的Email地址 "
115 . }
116 . },
117 . /* 错误信息的显示位置 */
118 . errorPlacement: function (error, element) {
119 . error.appendTo( element.parent() );
120 . },
121 . /* 验证通过时的处理 */
122 . success: function (label) {
123 . // set as text for IE
124 . label.html( " " ).addClass( " checked " );
125 . },
126 . /* 获得焦点时不验证 */
127 . focusInvalid: false ,
128 . onkeyup: false
129 . });
130 .
131 . // 输入框获得焦点时,样式设置
132 . $('input').focus( function (){
133 . if ($( this ).is( " :text " ) || $( this ).is( " :password " ))
134 . $( this ).addClass('focus');
135 . if ($( this ).hasClass('have_tooltip')) {
136 . $( this ).parent().parent().removeClass('field_normal').addClass('field_focus');
137 . }
138 . });
139 .
140 . // 输入框失去焦点时,样式设置
141 . $('input').blur( function () {
142 . $( this ).removeClass('focus');
143 . if ($( this ).hasClass('have_tooltip')) {
144 . $( this ).parent().parent().removeClass('field_focus').addClass('field_normal');
145 . }
146 . });
147 . });
网上的资料有人说,它跟prototype包会有冲突,我还没有同时使用过,这点不是很清楚,但我是发现一个问题:
对于最小/大 长度的验证方法,作者可能考虑到大家的命名习惯不同,同时做了minLength和minlength(maxLength和maxlength)方法, 应该哪一个都是可以的,但对于用户Message来说,只能够定义针对minlength(maxlength),才能调用用户自定义的Message,
否则只是调用包的默认Message,但具体原因还没有查清楚。同时,这个插件提供了本地化的消息,但对于我这里初学者来说,怎么使用它还有待摸索!