jquery插件開發(fā)之實(shí)現(xiàn)google+圈子選擇功能

具體原理與調(diào)用不詳述,可看代碼注釋及DEMO演示(演示中mod.udata.js里有一個(gè)漢字轉(zhuǎn)拼音方法,它并不是插件的一部分,但為插件提供了拼音搜索的功能)。
;(function ($) {
/*
* 基于jQuery實(shí)現(xiàn)類似Google+圈子選擇功能插件(支持鍵盤事件)@Mr.Think(http://mrthink.net/)
*/
$.fn.iChoose = function (options) {
var SELF=this;
var iset = $.extend({}, $.fn.iChoose.defaults, options);
var _h,pull=null;
var main=$(iset.choMain);
var chose=$(iset.choCls,main);
var input=$(SELF);
var tips=$(iset.tips,main);
var cls=iset.selCls;
var ids=$(iset.chsIds);
var _l=iset.limit;
//若無(wú)列表數(shù)據(jù)則中斷
if(iset.data.length==0){return false}
//初始化下拉列表
var tpl='<div class="'+iset.pullCls+'"><ul>';
var tplArr=[];
$.each(iset.data,function(k,v){
tplArr.push('<li data-mid="'+ v.mid+'" data-name="'+ v.filterName.toUpperCase()+'" class="hook_visible hook_'+v.mid+'">'+ v.name+'</li>');
});
tpl=tpl+tplArr.join('')+'</ul></div>';
if(pull==null){
main.append(tpl);
}
pull=$('.'+iset.pullCls,main);
_h=pull.find('li').outerHeight(true);
pull.width(main.width()-2);
//操作函數(shù)
var Action={
init:function(){
//列表鼠標(biāo)劃過
pull.delegate('li.hook_visible','mouseover',function(){
$(this).addClass(cls).siblings().removeClass(cls);
});
//選擇列表
pull.delegate('li.hook_visible','click',function(){
Action.choose($(this));
});
//點(diǎn)擊彈出列表
chose.click(function(){
Action.show();
});
//移除已選擇
chose.delegate('.'+iset.removeEl,'click',function(){
Action.undock($(this));
});
},
move: function(dir) {
//上下移動(dòng) - 上::str=up | 下::step=down;
var index;
var item=pull.find('li.hook_visible').filter(':visible');
var cur=item.filter('.'+cls);
cur.size()==0 ? index=-1 : index=item.index(cur);
item.eq(dir=='up' ? (index<1 ? 0 : index-1) : index+1).addClass(cls).siblings().removeClass(cls);
//移動(dòng)時(shí)跟隨滾動(dòng)
if(item.size()>_l){
//下翻滾動(dòng)
if(dir=='down'){
pull.scrollTop((index+2-_l)*_h);
}
//上翻滾動(dòng)
if(dir=='up'){
pull.scrollTop((index-1)*_h);
}
}
},
choose:function(el){
//列表選擇
var mid=el.attr('data-mid');
var name=el.text();
tips.before('<div class="'+iset.selItemCls+'"><span>'+name+'</span><a href="javascript:;" class="'+iset.removeEl+'" data-mid="'+mid+'">x</a></div>');
input.focus();
el.hide().removeClass('hook_visible');
//返回選中列表id
ids.val() =='' ? ids.val(mid) : ids.val(ids.val()+','+mid);
pull.find('li.hook_visible:first').addClass(cls).siblings().removeClass(cls);
this.upstyle();
},
undock:function(el){
//刪除已選
var mid=el.attr('data-mid');
var idsArr=ids.val().split(',');
input.focus();
el.parent().remove();
idsArr=$.grep(idsArr,function(v,k){
return v != mid;
});
ids.val(idsArr.join(','));
pull.find('li.hook_'+mid).show().addClass('hook_visible');
this.upstyle();
},
show:function(){
//顯示列表
pull.slideDown(100,function(){Action.match('')});
pull.find('li.hook_visible:first').addClass(cls).siblings().removeClass(cls);
$(SELF).focus();
tips.hide();
input.addClass(iset.inputWCls);
},
hide:function(){
//隱藏列表
pull.slideUp(100);
$(SELF).blur();
tips.show();
input.removeClass(iset.inputWCls);
},
upstyle:function(type){
//更新下拉列表樣式 - 當(dāng)已選換行時(shí) --
var len=pull.find('li.hook_visible').size();
if(type=='match'){
len=pull.find('li:visible').size();
}
if(len<_l){
pull.height(_h*len);
if(len==0){
this.hide();
}
}else{
pull.height(_h*_l);
}
pull.css('top',chose.outerHeight());
},
match:function(str){
//過濾選擇 - 拼音選擇須插件支持
var visible=pull.find('li.hook_visible');
visible.each(function(){
var name=$(this).attr('data-name');
name.match(str.toUpperCase())!=null ? $(this).show() : $(this).hide();
});
if(visible.size()==0 && $('.'+iset.noResCls).size()==0){
pull.find('li:first').before('<li class="'+iset.noResCls+'">暫無(wú)可選擇列表</li>')
}
this.upstyle('match');
},
blur:function(str){
//非選擇區(qū)域點(diǎn)擊隱藏
pull.find('li.hook_visible').each(function(){
var name=$(this).text();
if(name == str){
Action.choose($(this));
}
});
input.val('');
}
}
Action.init();
//鍵盤控制 - 綁定輸入表單
$(this).on({
//鍵盤彈起
'keyup change':function(){
var val= $.trim(input.val());
Action.match(val);
},
//失去焦點(diǎn)
'blur':function(){
var val= $.trim(input.val());
Action.blur(val);
},
//鍵盤按下 -- 捕獲鍵盤值,以執(zhí)行對(duì)應(yīng)事件
/*
8 - delete;
27 - esc;
38 - up;
40 - down;
9 - tab;
13 - enter
*/
'keydown':function(e){
switch (e.keyCode) {
case 8:
if($.trim(input.val())==''){
e.preventDefault();
var last=chose.find('.'+iset.removeEl+':last');
if(last.size()>0){
Action.undock(last);
}
}
break;
case 27:
e.preventDefault();
Action.hide();
break;
case 38:
e.preventDefault();
Action.move('up');
break;
case 40:
e.preventDefault();
Action.move('down')
break;
case 9:
case 13:
e.preventDefault();
Action.choose(pull.find('.'+cls));
break;
default:
$.noop();
}
}
});
//點(diǎn)擊非當(dāng)前區(qū)域隱藏彈出層
main.click(function(e){
e.stopPropagation();
});
$(document).click(function(){
Action.hide();
});
}
$.fn.iChoose.defaults = {
/*
data:傳入值,可以實(shí)時(shí)ajax傳上,演示中是json值,具體格式可參考mod.udatas.js中的$.map(...)
limit:每次顯示的條數(shù),其他滾動(dòng)顯示
choMain:載入?yún)^(qū)域id
pullCls:彈出列表的class
choCls:已選擇列表的外圍class
selItemCls:已選擇的單個(gè)元素class
removeEl:刪除元素的class
selCls:列表高亮的class
inputWCls:input的class
tips:默認(rèn)提示值元素鉤子
noResCls:列表中無(wú)結(jié)果時(shí)的cls
chsIds:已選擇列表的id值,傳給后端用的。(此值亦可用回調(diào)函數(shù)把值從插件中回傳出來(lái))
*/
data:UDatas,
limit:5,
choMain:'#iChooseMain',
pullCls:'icm-list',
choCls:'.icm-box',
selItemCls:'icm-item',
removeEl:'icm-delete',
selCls:'selected',
inputWCls:'icm-input-w',
tips:'.icm-cur-txt',
noResCls:'hook_noresult',
chsIds:'#iChooseIds'
}
})(jQuery);
- 跟我一起學(xué)寫jQuery插件開發(fā)方法(附完整實(shí)例及下載)
- 基于Jquery插件開發(fā)之圖片放大鏡效果(仿淘寶)
- jquery插件開發(fā)方法(初學(xué)者)
- 跟我一起學(xué)JQuery插件開發(fā)
- 學(xué)習(xí)從實(shí)踐開始之jQuery插件開發(fā) 對(duì)話框插件開發(fā)
- 學(xué)習(xí)從實(shí)踐開始之jQuery插件開發(fā) 菜單插件開發(fā)
- jQuery插件開發(fā)全解析
- jQuery插件開發(fā)基礎(chǔ)簡(jiǎn)單介紹
- jquery插件開發(fā)注意事項(xiàng)小結(jié)
- JQuery插件開發(fā)示例代碼
- 詳解jQuery插件開發(fā)中的extend方法
- jQuery插件開發(fā)的兩種方法及$.fn.extend的詳解
- jquery插件開發(fā)之實(shí)現(xiàn)jquery手風(fēng)琴功能分享
- jquery插件開發(fā)之實(shí)現(xiàn)md5插件
- jQuery插件開發(fā)詳細(xì)教程
- jQuery插件開發(fā)的五種形態(tài)小結(jié)
- jQuery插件開發(fā)精品教程(讓你的jQuery更上一個(gè)臺(tái)階)
相關(guān)文章
jquery實(shí)時(shí)獲取時(shí)間的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇jquery實(shí)時(shí)獲取時(shí)間的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-01-01
使用jQuery實(shí)現(xiàn)星級(jí)評(píng)分代碼分享
本文給大家分享的是一段使用jQuery制作的星級(jí)評(píng)分的代碼,非常大氣漂亮,功能也很實(shí)用,這里推薦個(gè)大家。2014-12-12
jQuery 浮動(dòng)廣告實(shí)現(xiàn)代碼
用jquery實(shí)現(xiàn)的浮動(dòng)廣告代碼,需要的朋友可以參考下。2008-12-12
優(yōu)化Jquery,提升網(wǎng)頁(yè)加載速度
本文是對(duì)優(yōu)化Jquery,提升網(wǎng)頁(yè)加載速度方面進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來(lái)參考下,希望對(duì)大家有所幫助2013-11-11
jQuery中scrollLeft()方法用法實(shí)例
這篇文章主要介紹了jQuery中scrollLeft()方法用法,實(shí)例分析了scrollLeft()方法的功能、定義及獲取或設(shè)置匹配元素相對(duì)滾動(dòng)條左側(cè)的偏移(offset)量時(shí)的使用技巧,需要的朋友可以參考下2015-01-01
詳解JavaScript異步編程中jQuery的promise對(duì)象的作用
這篇文章主要介紹了JavaScript異步編程中jQuery的promise對(duì)象的作用,同時(shí)也談到了js的Dojo框架中promise模式的實(shí)現(xiàn),需要的朋友可以參考下2016-05-05
JS Canvas定時(shí)器模擬動(dòng)態(tài)加載動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了JS Canvas定時(shí)器模擬動(dòng)態(tài)加載動(dòng)畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
為什么要在引入的css或者js文件后面加參數(shù)的詳細(xì)講解
為什么要在引入的css或者js文件后面加參數(shù)的詳細(xì)講解,需要的朋友可以參考一下2013-05-05

