用jQuery做更好的組件 通用組件定義模式
更新時間:2010年12月02日 12:43:48 作者:
當完成一個個交互的組件之后,為了更好組織代碼,漸漸的逼近了一個合理的模式,并且也從jQueryUI里面發(fā)現(xiàn)了這個模式。
這個模式的優(yōu)勢:
在jQuery對象和組件和實例之間可以互相保留引用。
代碼清晰。
易于擴展。
可以擺脫一些復雜的機制,手工完成組件。
最后一點是最有意思的,如果按這個模式來做,構造函數(shù)和原型方法都可以自由控制。能夠擺脫的東西就是一些繼承的hack手段,甚至jQuery也不是必須的。
手工的總是最好的。
一個簡陋DEMO
/*
* @by ambar_li
* @create 2010-11-30
* 標簽選擇,驗證
*/
(function($){
var tagSelector = function(input,options){
var me = this;
var opt = me.opt = $.extend({
limit : 5
,tags : null
,delimiter : ','
}, options || {});
var $el = me.input = $(input);
var $tags = me.tags = $(opt.tags);
if(!$el.length || !$tags.length) return;
$tags.click(function(e){
e.preventDefault();
var tag = $(this).text();
me[me.has(tag)?'remove':'add'](tag);
});
};
tagSelector.prototype = {
add : function(tag){
if(tag){
var me = this, tags = me.get(), del = me.opt.delimiter;
tags.push(tag);
me.input.val( tags.join(del) );
}
return me;
}
,remove : function(tag){
var me = this, exist = function(v){ return v !=tag; };
me.input.val( $.grep(me.get(),exist) );
return me;
}
,cleanify : function(){
return this.remove();
}
,limit : function(){
var me = this, tags = me.cleanify().get()
,len = tags.length, max = me.opt.limit;
if(len>max){
me.input.val( tags.slice(0,max) );
}
return me;
}
,has : function(tag){
return $.inArray(tag,this.get()) > -1;
}
,get : function(){
var val = $.trim(this.input.val());
return val ? $.map( val.split(/[,,]+/), $.trim ) : [];
}
};
$.fn.tagSelector = function(options){
return this.each(function(){
$(this).data('tagSelector',new tagSelector(this,options));
});
};
})(jQuery);
最重要的是最后一段。
jQueryUI對比,有初始化檢查:
this.each(function() {
var instance = $.data( this, name );
if ( instance ) {
instance.option( options || {} )._init();
} else {
$.data( this, name, new object( options, this ) );
}
});
兩種調(diào)用方式
var $input = $('#tb_tags').tagSelector( { tags:'div.tag_group a:not(.btn_tag_more)'} );
var api = $input.data('tagSelector');
// var api = new tagSelector('#tb_tags',{ tags :'div.tag_group a:not(.btn_tag_more)' });
完整演示:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
在jQuery對象和組件和實例之間可以互相保留引用。
代碼清晰。
易于擴展。
可以擺脫一些復雜的機制,手工完成組件。
最后一點是最有意思的,如果按這個模式來做,構造函數(shù)和原型方法都可以自由控制。能夠擺脫的東西就是一些繼承的hack手段,甚至jQuery也不是必須的。
手工的總是最好的。
一個簡陋DEMO
復制代碼 代碼如下:
/*
* @by ambar_li
* @create 2010-11-30
* 標簽選擇,驗證
*/
(function($){
var tagSelector = function(input,options){
var me = this;
var opt = me.opt = $.extend({
limit : 5
,tags : null
,delimiter : ','
}, options || {});
var $el = me.input = $(input);
var $tags = me.tags = $(opt.tags);
if(!$el.length || !$tags.length) return;
$tags.click(function(e){
e.preventDefault();
var tag = $(this).text();
me[me.has(tag)?'remove':'add'](tag);
});
};
tagSelector.prototype = {
add : function(tag){
if(tag){
var me = this, tags = me.get(), del = me.opt.delimiter;
tags.push(tag);
me.input.val( tags.join(del) );
}
return me;
}
,remove : function(tag){
var me = this, exist = function(v){ return v !=tag; };
me.input.val( $.grep(me.get(),exist) );
return me;
}
,cleanify : function(){
return this.remove();
}
,limit : function(){
var me = this, tags = me.cleanify().get()
,len = tags.length, max = me.opt.limit;
if(len>max){
me.input.val( tags.slice(0,max) );
}
return me;
}
,has : function(tag){
return $.inArray(tag,this.get()) > -1;
}
,get : function(){
var val = $.trim(this.input.val());
return val ? $.map( val.split(/[,,]+/), $.trim ) : [];
}
};
$.fn.tagSelector = function(options){
return this.each(function(){
$(this).data('tagSelector',new tagSelector(this,options));
});
};
})(jQuery);
最重要的是最后一段。
jQueryUI對比,有初始化檢查:
復制代碼 代碼如下:
this.each(function() {
var instance = $.data( this, name );
if ( instance ) {
instance.option( options || {} )._init();
} else {
$.data( this, name, new object( options, this ) );
}
});
兩種調(diào)用方式
復制代碼 代碼如下:
var $input = $('#tb_tags').tagSelector( { tags:'div.tag_group a:not(.btn_tag_more)'} );
var api = $input.data('tagSelector');
// var api = new tagSelector('#tb_tags',{ tags :'div.tag_group a:not(.btn_tag_more)' });
完整演示:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
相關文章
jQuery結合Json提交數(shù)據(jù)到Webservice,并接收從Webservice返回的Json數(shù)據(jù)
簡單的Json數(shù)據(jù)提交,后臺結合asp.net,需要的朋友可以參考下。2011-02-02jQuery插件ajaxFileUpload實現(xiàn)異步上傳文件效果
jQuery插件AjaxFileUpload用來實現(xiàn)ajax文件上傳,該插件使用非常簡單,接下來我們來看下用AjaxFileUpload插件實現(xiàn)文件上傳的方法,有需要的小伙伴可以參考下2015-04-04