jQuery插件开发示例:表单验证
上周写了一个页面,里面有一个很大的form,一个一个写验证太麻烦了,于是写了一个jQuery的表单验证插件。我希望达到这样的效果:
?
$('#form').required('input1Name').maxlength('input1Name',7).required('input2Name').email('input2Name').validate(userSpecifiedConfig);? ? ? ? ? 以上语句达到的效果是name属性为input1Name的表单项必填,最长长度为7;name属性为input2Name的表单项必填,并符合email的格式。? ? ?2. 插件应该是可配置的,通过上面的userSpecifiedConfig对象,修改或者部分修改默认配置
(function($){ //overridable configuration var config = { validateOnBlur : true, showAllErrorOnSubmit : true, validateFailCallBack : function(rule){ alert(rule.explain); } }; //public method var methods = { validate : function(options) { return this.each(function() { // If options exist, lets merge them // with our default settings if ( options ) { $.extend( config, options ); } //do other stuff }); }, required : function(inputName,explain){ //Maintaining Chainability return this.each(function(){ //do your thing }); }, }; $.fn.validate = function( method ) { // Method calling logic if ( methods[method] ) { return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 )); } else if ( typeof method === 'object' || ! method ) { return methods.validate.apply( this, arguments ); } else { $.error( 'Method ' + method + ' does not exist on jQuery.validate' ); } };})(jQuery);
$('#1').bind('focus',function(){});?? ? ? ? ? ?这种风格的API,将方法名字作为第一个参数传入。同时我在插件里定义一个methods对象,将各种方法的实现塞在里面下面具体看每个方法的实现,以代码中的methods.validate函数为例,首先,不加思索的,第一行写上return this.each(function(){}),这是为了返回this对象,从而实现链式的调用,有点诡异,看来each返回的是调用者本身?API上并没有提到这点。然后,如果你需要修改默认配置,得在函数参数里加上比如说option,option应该类似这样的
option={ validateOnBlur :false}?
$('#infoform').validate('required','name','请填写公司名称') .validate('required','password','请填写密码') .validate('required','contactName','请填写联系人姓名') .validate('chineseName','contactName') .validate('required','province','请选择您所在的省') .validate('required','city','请选择您所在的城市') .validate('required','address','请填写您所在的地址') .validate('required','email','请填写您的电子邮箱地址') .validate('email','email','请填写有效的电子邮箱地址') .validate('custome','confirmPassword',function(){ var p = $(':password[name=password]').attr('value'); var confirm = $(':password[name=confirmPassword]').attr('value'); if(p == confirm){ return true; } return false; },'确认密码与密码不符') .validate({ validateFailCallBack : function(rule){ $(':input[name='+rule.name+']','#infoform').each(function(){ var parent = $(this).parent(); parent.addClass('fm-error'); $('.fm-explain',parent).html(rule.explain); //reset when on focus again $(this).bind('focus',function(){ //clear error style }); }); } });?这样就搞定了一个表单的验证,很方便有木有!!
?