jQuery插件實(shí)現(xiàn)多級(jí)聯(lián)動(dòng)菜單效果
開(kāi)發(fā)中,有好多地方用到聯(lián)動(dòng)菜單,以前每次遇到聯(lián)動(dòng)菜單的時(shí)候都去重新寫(xiě),代碼重用率很低,前幾天又遇到聯(lián)動(dòng)菜單的問(wèn)題,總結(jié)了下,發(fā)現(xiàn)可以開(kāi)發(fā)一個(gè)聯(lián)動(dòng)菜單的功能,以后想用的時(shí)候就方便多了。項(xiàng)目中每個(gè)頁(yè)面都有引用jQuery,,開(kāi)發(fā)個(gè)jQuery聯(lián)動(dòng)菜單插件,說(shuō)動(dòng)手就動(dòng)手,下面跟大家分享分享。
我用的jQuery插件方式
(function($){
$.fn.casmenu=function(argvs){
//your code
}
})(jQuery);
其中jQuery傳入的是jquery對(duì)象,需要在擴(kuò)展之前引用。在擴(kuò)展中同樣使用jQuery的短格式$。
$.fn是指jquery的命名空間,加在fn上的方法及屬性,會(huì)對(duì)jquery實(shí)例每一個(gè)有效,看看下面的jquery源碼101行左右:
jQuery.fn = jQuery.prototype = {
......
}
比如說(shuō)后面要開(kāi)發(fā)的$.fn.casmenu(),定義之后,在后面的jquery對(duì)象都可以使用該方法。
這里還有一種擴(kuò)展的方法:
$.extend({
funName: function(){
//your code
},
});
這種擴(kuò)展方法和上面的是有區(qū)別的,要是拿類(lèi)做類(lèi)比的話,$.extend這種方法相當(dāng)于類(lèi)中的靜態(tài)方法,上面的一種方式相當(dāng)于非靜態(tài)方法,必須有對(duì)象才可以使用。簡(jiǎn)單的理解,是下面這樣的:
//$.fn.casemenu 方式擴(kuò)展的方法,必須在有jquery對(duì)象的時(shí)候才可以使用
$("#mydiv").casmenu();
//$.extend({}) 方式擴(kuò)展的方法,可以直接使用
$.add(2,3);
設(shè)計(jì)思路
首先是層級(jí)菜單的數(shù)據(jù)保存方式,看看下面的數(shù)據(jù):
var levels={
//內(nèi)容中有引號(hào),必須使用單引號(hào),外引號(hào)必須用雙引號(hào)
//name => value
1:{
退出應(yīng)用: "code1003",
登錄界面:"code1004",
跳轉(zhuǎn)至個(gè)人資料界面:"code1005",
},
2:{
退出應(yīng)用:{
應(yīng)用1:"gameid1",
應(yīng)用2:"gameid2",
應(yīng)用3:"gameid3",
應(yīng)用4:"gameid4",
應(yīng)用5:"gameid5",
},
跳轉(zhuǎn)至個(gè)人資料界面:{
主界面:"main interface",
}
},
3:{
應(yīng)用1:{
中級(jí)場(chǎng):"12",
高級(jí)場(chǎng):"13",
職業(yè)場(chǎng):"14",
比賽場(chǎng):"15",
}
}
}
對(duì)象levels中的直接鍵值1、2、3代表菜單的層級(jí),沒(méi)有就不用些,每一項(xiàng)name=>value代表select中option的名稱(chēng)和value。
層級(jí)有規(guī)律,某一層級(jí)中的某一項(xiàng)要是有下一級(jí)菜單,在下一層及有該項(xiàng)的名稱(chēng),就像levels[1]['退出應(yīng)用']在有下級(jí)菜單,就有l(wèi)evels[2]['退出應(yīng)用'],要是繼續(xù)有下級(jí)菜單,就像levels[2]['退出應(yīng)用']['應(yīng)用1'],會(huì)在下一層及中繼續(xù)有l(wèi)evels[3]['應(yīng)用1']。這樣一來(lái),就實(shí)現(xiàn)了無(wú)限級(jí)聯(lián)動(dòng)菜單,不同的聯(lián)動(dòng)菜單只需要修改菜單配置文件就可以了。
但是這么做又有一個(gè)遺憾,就是如果level2[2]中的子項(xiàng)有兩個(gè)名稱(chēng)相同的,都有下級(jí)菜單,而且下級(jí)菜單內(nèi)容還不一樣,就會(huì)有問(wèn)題,因此在設(shè)置的時(shí)候,有下級(jí)菜單的項(xiàng)要取不同的名稱(chēng),這里要注意下。就目前這種來(lái)說(shuō),簡(jiǎn)單,好理解,也夠用了。
代碼實(shí)現(xiàn)
在代碼中也用到了$.extend,用來(lái)擴(kuò)展默認(rèn)配置。
還有一個(gè)點(diǎn)要注意,在聯(lián)動(dòng)的時(shí)候會(huì)將實(shí)事的菜單值放入一個(gè)屬性為hidden的input中,用默認(rèn)逗號(hào)分割每個(gè)層級(jí)之間的值,可以很輕松的獲取到聯(lián)動(dòng)菜單所有項(xiàng)的值
if(typeof(AI.opts.saveinput) != "undefined" && (AI.opts.saveinput = AI.opts.saveinput.toString()) != ''){
$("<input type='hidden' value='' name='"+AI.opts.saveinput+"' id='"+AI.opts.saveinput+"' />").appendTo($('body'));
}
(function($){
//配置
var AI={
opts:{
saveinput:"jumpcode", //是否將結(jié)果保存至input
levels:{},
ulObj:{},//保存生成好的ul列表
length:0, //層級(jí)菜單的層級(jí)
divide:",",//默認(rèn)各個(gè)層級(jí)菜單之間的分隔符
}
};
$.fn.casmenu=function(opts){
AI.opts = $.extend(AI.opts, opts);
if((AI.opts.length = Object.keys(AI.opts.levels).length) <= 0){
throw "levels arr must not be empty";
return;
}
var _levels = AI.opts.levels;
if(_levels[1] == undefined){
throw "menu level 1 must not be empty";
return;
}
var _levels_1 = _levels[1];
if(typeof(AI.opts.saveinput) != "undefined" && (AI.opts.saveinput = AI.opts.saveinput.toString()) != ''){
$("<input type='hidden' value='' name='"+AI.opts.saveinput+"' id='"+AI.opts.saveinput+"' />").appendTo($('body'));
}
AI.opts.ulObj['level_1'] = '<select class="casmenu" level="1">';
AI.opts.ulObj['level_1'] += '<option value="null">請(qǐng)選擇</option>';
$("#"+AI.opts.saveinput).val('null');
for(var i in _levels_1){
AI.opts.ulObj['level_1'] += '<option name="'+i+'" value="'+_levels_1[i]+'">'+i+'</option>';
}
AI.opts.ulObj['level_1'] += '</select>';
$(AI.opts.ulObj['level_1']).appendTo(this);
$("body").on("change", ".casmenu", function(){
var level = $(this).attr("level");
if(level > AI.opts.length) return;
level++;
//移除當(dāng)前觸發(fā)菜單之后的菜單
for(var num=level;num<=AI.opts.length;num++){
$(".casmenu[level="+num+"]").remove();
}
//設(shè)置input的值,級(jí)聯(lián)菜單的值
var _val = '';
for(var val=1;val<=AI.opts.length;val++){
var __val = $("select[level="+val+"]");
if(__val.length <= 0)
continue;
_val += __val.val()+AI.opts.divide;
}
$("#"+AI.opts.saveinput).val(_val.substr(0, _val.length-1));
//levels對(duì)象中不存在下一級(jí)別目錄
if(typeof(AI.opts.levels[level]) == "undefined") return;
//獲取下一級(jí)別目錄的鍵值,值不存在的話返回
var name = $(this).find("option:selected").attr("name");
if(typeof(AI.opts.levels[level][name]) == "undefined") return;
if(typeof(AI.opts.ulObj['level_'+level]) == "undefined" || typeof(AI.opts.ulObj['level_'+level][name]) == "undefined"){
if(typeof(AI.opts.ulObj['level_'+level]) == "undefined")
AI.opts.ulObj['level_'+level] = {};
AI.opts.ulObj['level_'+level][name] = '<select class="casmenu" level="'+level+'">';
AI.opts.ulObj['level_'+level][name] += '<option value="null">請(qǐng)選擇</option>';
var levelinfo = AI.opts.levels[level][name];
for(var i in levelinfo){
AI.opts.ulObj['level_'+level][name] += '<option name="'+i+'" value="'+levelinfo[i]+'" >'+i+'</option>';
}
AI.opts.ulObj['level_'+level][name] += '</select>';
}
$(AI.opts.ulObj['level_'+level][name]).appendTo($(this).parent());
var _val = '';
for(var val=1;val<=AI.opts.length;val++){
var __val = $("select[level="+val+"]");
if(__val.length <= 0)
continue;
_val += __val.val()+AI.opts.divide;
}
$("#"+AI.opts.saveinput).val(_val.substr(0, _val.length-1));
});
}
})(jQuery);
運(yùn)行效果:


以上就是為大家分享的jQuery插件實(shí)現(xiàn)多級(jí)聯(lián)動(dòng)菜單效果,希望對(duì)大家的學(xué)習(xí)有所幫助。
- jquery 實(shí)現(xiàn)二級(jí)/三級(jí)/多級(jí)聯(lián)動(dòng)菜單的思路及代碼
- jquery 多級(jí)下拉菜單核心代碼
- jquery+CSS實(shí)現(xiàn)的多級(jí)豎向展開(kāi)樹(shù)形TRee菜單效果
- jQuery實(shí)現(xiàn)精美的多級(jí)下拉菜單特效
- jquery實(shí)現(xiàn)多級(jí)下拉菜單的實(shí)例代碼
- jQuery實(shí)現(xiàn)多級(jí)下拉菜單jDropMenu的方法
- jQuery多級(jí)手風(fēng)琴菜單實(shí)例講解
- jQuery插件cxSelect多級(jí)聯(lián)動(dòng)下拉菜單實(shí)例解析
- jquery實(shí)現(xiàn)帶漸變淡入淡出并向右依次展開(kāi)的多級(jí)菜單效果實(shí)例
- 基于jquery實(shí)現(xiàn)多級(jí)菜單效果
相關(guān)文章
jquery創(chuàng)建并行對(duì)象或者合并對(duì)象的實(shí)現(xiàn)代碼
如果有對(duì)象A ,B 現(xiàn)在我想要合并成對(duì)象C 從C里面可以找到A , B 及其子對(duì)象 怎么做2012-10-10
jQuery判斷郵箱格式對(duì)錯(cuò)實(shí)例代碼講解
本文通過(guò)實(shí)例代碼給大家講解了基于jquery判斷郵箱格式對(duì)錯(cuò),非常實(shí)用,具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-04-04
JQuery實(shí)現(xiàn)動(dòng)態(tài)添加刪除評(píng)論的方法
這篇文章主要介紹了JQuery實(shí)現(xiàn)動(dòng)態(tài)添加刪除評(píng)論的方法,涉及jQuery處理鼠標(biāo)事件及json數(shù)據(jù)的相關(guān)技巧,需要的朋友可以參考下2015-05-05
從零開(kāi)始學(xué)習(xí)jQuery (十) jQueryUI常用功能實(shí)戰(zhàn)
本文是實(shí)戰(zhàn)篇. 使用jQueryUI完成制作網(wǎng)站的大部分常用功能.2011-02-02
Bootstrap框架建立樹(shù)形菜單(Tree)的實(shí)例代碼
這篇文章主要介紹了在Bootstrap框架下怎么去建立一個(gè)樹(shù)形菜單,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2017-10-10
jQuery滾動(dòng)監(jiān)聽(tīng)實(shí)現(xiàn)商城樓梯式導(dǎo)航效果
這篇文章主要介紹了jQuery滾動(dòng)監(jiān)聽(tīng),實(shí)現(xiàn)商城樓梯式導(dǎo)航,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03

