能够根据自定义的菜单数据和select,自动设置联级的下拉菜单,可定义默认值。
效果:
<style type="text/css"> .sel select{ width:100px;} </style> <script type="text/javascript"> var $$ = function (id) { return "string" == typeof id ? document.getElementById(id) : id; }; function addEventHandler(oTarget, sEventType, fnHandler) { if (oTarget.addEventListener) { oTarget.addEventListener(sEventType, fnHandler, false); } else if (oTarget.attachEvent) { oTarget.attachEvent("on" + sEventType, fnHandler); } else { oTarget["on" + sEventType] = fnHandler; } }; function Each(arrList, fun){ for (var i = 0, len = arrList.length; i < len; i++) { fun(arrList[i], i); } }; function GetOption(val, txt) { var op = document.createElement("OPTION"); op.value = val; op.innerHTML = txt; return op; }; var Class = { create: function() { return function() { this.initialize.apply(this, arguments); } } } Object.extend = function(destination, source) { for (var property in source) { destination[property] = source[property]; } return destination; } var CascadeSelect = Class.create(); CascadeSelect.prototype = { //select集合,菜单对象 initialize: function(arrSelects, arrMenu, options) { if(arrSelects.length <= 0 || arrMenu.lenght <= 0) return;//菜单对象 var oThis = this; this.Selects = [];//select集合 this.Menu = arrMenu;//菜单对象 this.SetOptions(options); this.Default = this.options.Default || []; this.ShowEmpty = !!this.options.ShowEmpty; this.EmptyText = this.options.EmptyText.toString(); //设置Selects集合和change事件 Each(arrSelects, function(o, i){ addEventHandler((oThis.Selects[i] = $$(o)), "change", function(){ oThis.Set(i); }); }); this.ReSet(); }, //设置默认属性 SetOptions: function(options) { this.options = {//默认值 Default: [],//默认值(按顺序) ShowEmpty: false,//是否显示空值(位于第一个) EmptyText: "请选择"//空值显示文本(ShowEmpty为true时有效) }; Object.extend(this.options, options || {}); }, //初始化select ReSet: function() { this.SetSelect(this.Selects[0], this.Menu, this.Default.shift()); this.Set(0); }, //全部select设置 Set: function(index) { var menu = this.Menu //第一个select不需要处理所以从1开始 for(var i=1, len = this.Selects.length; i < len; i++){ if(menu.length > 0){ //获取菜单 var value = this.Selects[i-1].value; if(value!=""){ Each(menu, function(o){ if(o.val == value){ menu = o.menu || []; } }); } else { menu = []; } //设置菜单 if(i > index){ this.SetSelect(this.Selects[i], menu, this.Default.shift()); } } else { //没有数据 this.SetSelect(this.Selects[i], [], ""); } } //清空默认值 this.Default.length = 0; }, //select设置 SetSelect: function(oSel, menu, value) { oSel.options.length = 0; oSel.disabled = false; if(this.ShowEmpty){ oSel.appendChild(GetOption("", this.EmptyText)); } if(menu.length <= 0){ oSel.disabled = true; return; } Each(menu, function(o){ var op = GetOption(o.val, o.txt ? o.txt : o.val); op.selected = (value == op.value); oSel.appendChild(op); }); }, //添加菜单 Add: function(menu) { this.Menu[this.Menu.length] = menu; this.ReSet(); }, //删除菜单 Delete: function(index) { if(index < 0 || index >= this.Menu.length) return; for(var i = index, len = this.Menu.length - 1; i < len; i++){ this.Menu[i] = this.Menu[i + 1]; } this.Menu.pop() this.ReSet(); } }; </script>
<script type="text/javascript"> var menu = [ {'val': '1', 'txt': 'value'}, {'val': '2 ->', 'menu': [ {'val': '2_1'}, {'val': '2_2'} ]}, {'val': '3 ->', 'menu': [ {'val': '3_1 ->', 'menu': [ {'val': '3_1_1'}, {'val': '3_1_2'} ]}, {'val': '3_2'} ]}, {'val': '4 ->', 'menu': [ {'val': '4_1 ->', 'menu': [ {'val': '4_1_1 ->', 'menu': [ {'val': '4_1_1_1'} ]} ]} ]} ]; var sel=["sel1", "sel2", "sel3", "sel4", "sel5"]; var val=["3 ->", "3_1 ->", "3_1_2"]; var cs = new CascadeSelect(sel, menu, { Default: val }); $$("btnA").οnclick=function(){cs.ShowEmpty=!cs.ShowEmpty;} $$("btnB").οnclick=function(){ cs.Add( {'val': '5 ->', 'menu': [ {'val': '5_1 ->', 'menu': [ {'val': '5_1_1 ->', 'menu': [ {'val': '5_1_1_1 ->', 'menu': [ {'val': '5_1_1_1_1'} ]} ]} ]} ]} ) } $$("btnC").οnclick=function(){ cs.Delete(3) }</script>
其中参数1是菜单结构:
菜单对象
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->var menu = [
{'val': '1', 'txt': 'value'},
{'val': '2 ->', 'menu': [
{'val': '2_1'},
{'val': '2_2'}
]},
{'val': '3 ->', 'menu': [
{'val': '3_1 ->', 'menu': [
{'val': '3_1_1'},
{'val': '3_1_2'}
]},
{'val': '3_2'}
]},
{'val': '4 ->', 'menu': [
{'val': '4_1 ->', 'menu': [
{'val': '4_1_1 ->', 'menu': [
{'val': '4_1_1_1'}
]}
]}
]}
];
参数2是select的id集合(按顺序):
可设置默认值(按顺序):
源码:
效果:
<style type="text/css"> .sel select{ width:100px;} </style> <script type="text/javascript"> var $$ = function (id) { return "string" == typeof id ? document.getElementById(id) : id; }; function addEventHandler(oTarget, sEventType, fnHandler) { if (oTarget.addEventListener) { oTarget.addEventListener(sEventType, fnHandler, false); } else if (oTarget.attachEvent) { oTarget.attachEvent("on" + sEventType, fnHandler); } else { oTarget["on" + sEventType] = fnHandler; } }; function Each(arrList, fun){ for (var i = 0, len = arrList.length; i < len; i++) { fun(arrList[i], i); } }; function GetOption(val, txt) { var op = document.createElement("OPTION"); op.value = val; op.innerHTML = txt; return op; }; var Class = { create: function() { return function() { this.initialize.apply(this, arguments); } } } Object.extend = function(destination, source) { for (var property in source) { destination[property] = source[property]; } return destination; } var CascadeSelect = Class.create(); CascadeSelect.prototype = { //select集合,菜单对象 initialize: function(arrSelects, arrMenu, options) { if(arrSelects.length <= 0 || arrMenu.lenght <= 0) return;//菜单对象 var oThis = this; this.Selects = [];//select集合 this.Menu = arrMenu;//菜单对象 this.SetOptions(options); this.Default = this.options.Default || []; this.ShowEmpty = !!this.options.ShowEmpty; this.EmptyText = this.options.EmptyText.toString(); //设置Selects集合和change事件 Each(arrSelects, function(o, i){ addEventHandler((oThis.Selects[i] = $$(o)), "change", function(){ oThis.Set(i); }); }); this.ReSet(); }, //设置默认属性 SetOptions: function(options) { this.options = {//默认值 Default: [],//默认值(按顺序) ShowEmpty: false,//是否显示空值(位于第一个) EmptyText: "请选择"//空值显示文本(ShowEmpty为true时有效) }; Object.extend(this.options, options || {}); }, //初始化select ReSet: function() { this.SetSelect(this.Selects[0], this.Menu, this.Default.shift()); this.Set(0); }, //全部select设置 Set: function(index) { var menu = this.Menu //第一个select不需要处理所以从1开始 for(var i=1, len = this.Selects.length; i < len; i++){ if(menu.length > 0){ //获取菜单 var value = this.Selects[i-1].value; if(value!=""){ Each(menu, function(o){ if(o.val == value){ menu = o.menu || []; } }); } else { menu = []; } //设置菜单 if(i > index){ this.SetSelect(this.Selects[i], menu, this.Default.shift()); } } else { //没有数据 this.SetSelect(this.Selects[i], [], ""); } } //清空默认值 this.Default.length = 0; }, //select设置 SetSelect: function(oSel, menu, value) { oSel.options.length = 0; oSel.disabled = false; if(this.ShowEmpty){ oSel.appendChild(GetOption("", this.EmptyText)); } if(menu.length <= 0){ oSel.disabled = true; return; } Each(menu, function(o){ var op = GetOption(o.val, o.txt ? o.txt : o.val); op.selected = (value == op.value); oSel.appendChild(op); }); }, //添加菜单 Add: function(menu) { this.Menu[this.Menu.length] = menu; this.ReSet(); }, //删除菜单 Delete: function(index) { if(index < 0 || index >= this.Menu.length) return; for(var i = index, len = this.Menu.length - 1; i < len; i++){ this.Menu[i] = this.Menu[i + 1]; } this.Menu.pop() this.ReSet(); } }; </script>
其中参数1是菜单结构:
![](https://i-blog.csdnimg.cn/blog_migrate/0be121fa5b8988fbabbbc526af3b0fc0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/34031c708bfe702fe82d01ff5c6593aa.gif)
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->var menu = [
{'val': '1', 'txt': 'value'},
{'val': '2 ->', 'menu': [
{'val': '2_1'},
{'val': '2_2'}
]},
{'val': '3 ->', 'menu': [
{'val': '3_1 ->', 'menu': [
{'val': '3_1_1'},
{'val': '3_1_2'}
]},
{'val': '3_2'}
]},
{'val': '4 ->', 'menu': [
{'val': '4_1 ->', 'menu': [
{'val': '4_1_1 ->', 'menu': [
{'val': '4_1_1_1'}
]}
]}
]}
];
参数2是select的id集合(按顺序):
var
sel
=
[
"
sel1
"
,
"
sel2
"
,
"
sel3
"
,
"
sel4
"
,
"
sel5
"
]
可设置默认值(按顺序):
var
val
=
[
"
3 ->
"
,
"
3_1 ->
"
,
"
3_1_2
"
];
源码:
<!
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head >
< meta http-equiv ="Content-Type" content ="text/html; charset=gb2312" />
< title > JavaScript 自定义多级联动下拉菜单 </ title >
< script type ="text/javascript" >
var $ = function (id) {
return " string " == typeof id ? document.getElementById(id) : id;
};
function addEventHandler(oTarget, sEventType, fnHandler) {
if (oTarget.addEventListener) {
oTarget.addEventListener(sEventType, fnHandler, false );
} else if (oTarget.attachEvent) {
oTarget.attachEvent( " on " + sEventType, fnHandler);
} else {
oTarget[ " on " + sEventType] = fnHandler;
}
};
function Each(arrList, fun){
for ( var i = 0 , len = arrList.length; i < len; i ++ ) { fun(arrList[i], i); }
};
function GetOption(val, txt) {
var op = document.createElement( " OPTION " );
op.value = val; op.innerHTML = txt;
return op;
};
var Class = {
create: function () {
return function () {
this .initialize.apply( this , arguments);
}
}
}
Object.extend = function (destination, source) {
for ( var property in source) {
destination[property] = source[property];
}
return destination;
}
var CascadeSelect = Class.create();
CascadeSelect.prototype = {
// select集合,菜单对象
initialize: function (arrSelects, arrMenu, options) {
if (arrSelects.length <= 0 || arrMenu.lenght <= 0 ) return ; // 菜单对象
var oThis = this ;
this .Selects = []; // select集合
this .Menu = arrMenu; // 菜单对象
this .SetOptions(options);
this .Default = this .options.Default || [];
this .ShowEmpty = !! this .options.ShowEmpty;
this .EmptyText = this .options.EmptyText.toString();
// 设置Selects集合和change事件
Each(arrSelects, function (o, i){
addEventHandler((oThis.Selects[i] = $(o)), " change " , function (){ oThis.Set(i); });
});
this .ReSet();
},
// 设置默认属性
SetOptions: function (options) {
this .options = { // 默认值
Default: [], // 默认值(按顺序)
ShowEmpty: false , // 是否显示空值(位于第一个)
EmptyText: " 请选择 " // 空值显示文本(ShowEmpty为true时有效)
};
Object.extend( this .options, options || {});
},
// 初始化select
ReSet: function () {
this .SetSelect( this .Selects[ 0 ], this .Menu, this .Default.shift());
this .Set( 0 );
},
// 全部select设置
Set: function (index) {
var menu = this .Menu
// 第一个select不需要处理所以从1开始
for ( var i = 1 , len = this .Selects.length; i < len; i ++ ){
if (menu.length > 0 ){
// 获取菜单
var value = this .Selects[i - 1 ].value;
if (value != "" ){
Each(menu, function (o){ if (o.val == value){ menu = o.menu || []; } });
} else { menu = []; }
// 设置菜单
if (i > index){ this .SetSelect( this .Selects[i], menu, this .Default.shift()); }
} else {
// 没有数据
this .SetSelect( this .Selects[i], [], "" );
}
}
// 清空默认值
this .Default.length = 0 ;
},
// select设置
SetSelect: function (oSel, menu, value) {
oSel.options.length = 0 ; oSel.disabled = false ;
if ( this .ShowEmpty){ oSel.appendChild(GetOption( "" , this .EmptyText)); }
if (menu.length <= 0 ){ oSel.disabled = true ; return ; }
Each(menu, function (o){
var op = GetOption(o.val, o.txt ? o.txt : o.val); op.selected = (value == op.value);
oSel.appendChild(op);
});
},
// 添加菜单
Add: function (menu) {
this .Menu[ this .Menu.length] = menu;
this .ReSet();
},
// 删除菜单
Delete: function (index) {
if (index < 0 || index >= this .Menu.length) return ;
for ( var i = index, len = this .Menu.length - 1 ; i < len; i ++ ){ this .Menu[i] = this .Menu[i + 1 ]; }
this .Menu.pop()
this .ReSet();
}
};
window.onload = function (){
var menu = [
{ ' val ' : ' 1 ' , ' txt ' : ' value ' },
{ ' val ' : ' 2 -> ' , ' menu ' : [
{ ' val ' : ' 2_1 ' },
{ ' val ' : ' 2_2 ' }
]},
{ ' val ' : ' 3 -> ' , ' menu ' : [
{ ' val ' : ' 3_1 -> ' , ' menu ' : [
{ ' val ' : ' 3_1_1 ' },
{ ' val ' : ' 3_1_2 ' }
]},
{ ' val ' : ' 3_2 ' }
]},
{ ' val ' : ' 4 -> ' , ' menu ' : [
{ ' val ' : ' 4_1 -> ' , ' menu ' : [
{ ' val ' : ' 4_1_1 -> ' , ' menu ' : [
{ ' val ' : ' 4_1_1_1 ' }
]}
]}
]}
];
var sel = [ " sel1 " , " sel2 " , " sel3 " , " sel4 " , " sel5 " ];
var val = [ " 3 -> " , " 3_1 -> " , " 3_1_2 " ];
var cs = new CascadeSelect(sel, menu, { Default: val });
$( " btnA " ).onclick = function (){cs.ShowEmpty =! cs.ShowEmpty;}
$( " btnB " ).onclick = function (){
cs.Add(
{ ' val ' : ' 5 -> ' , ' menu '
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head >
< meta http-equiv ="Content-Type" content ="text/html; charset=gb2312" />
< title > JavaScript 自定义多级联动下拉菜单 </ title >
< script type ="text/javascript" >
var $ = function (id) {
return " string " == typeof id ? document.getElementById(id) : id;
};
function addEventHandler(oTarget, sEventType, fnHandler) {
if (oTarget.addEventListener) {
oTarget.addEventListener(sEventType, fnHandler, false );
} else if (oTarget.attachEvent) {
oTarget.attachEvent( " on " + sEventType, fnHandler);
} else {
oTarget[ " on " + sEventType] = fnHandler;
}
};
function Each(arrList, fun){
for ( var i = 0 , len = arrList.length; i < len; i ++ ) { fun(arrList[i], i); }
};
function GetOption(val, txt) {
var op = document.createElement( " OPTION " );
op.value = val; op.innerHTML = txt;
return op;
};
var Class = {
create: function () {
return function () {
this .initialize.apply( this , arguments);
}
}
}
Object.extend = function (destination, source) {
for ( var property in source) {
destination[property] = source[property];
}
return destination;
}
var CascadeSelect = Class.create();
CascadeSelect.prototype = {
// select集合,菜单对象
initialize: function (arrSelects, arrMenu, options) {
if (arrSelects.length <= 0 || arrMenu.lenght <= 0 ) return ; // 菜单对象
var oThis = this ;
this .Selects = []; // select集合
this .Menu = arrMenu; // 菜单对象
this .SetOptions(options);
this .Default = this .options.Default || [];
this .ShowEmpty = !! this .options.ShowEmpty;
this .EmptyText = this .options.EmptyText.toString();
// 设置Selects集合和change事件
Each(arrSelects, function (o, i){
addEventHandler((oThis.Selects[i] = $(o)), " change " , function (){ oThis.Set(i); });
});
this .ReSet();
},
// 设置默认属性
SetOptions: function (options) {
this .options = { // 默认值
Default: [], // 默认值(按顺序)
ShowEmpty: false , // 是否显示空值(位于第一个)
EmptyText: " 请选择 " // 空值显示文本(ShowEmpty为true时有效)
};
Object.extend( this .options, options || {});
},
// 初始化select
ReSet: function () {
this .SetSelect( this .Selects[ 0 ], this .Menu, this .Default.shift());
this .Set( 0 );
},
// 全部select设置
Set: function (index) {
var menu = this .Menu
// 第一个select不需要处理所以从1开始
for ( var i = 1 , len = this .Selects.length; i < len; i ++ ){
if (menu.length > 0 ){
// 获取菜单
var value = this .Selects[i - 1 ].value;
if (value != "" ){
Each(menu, function (o){ if (o.val == value){ menu = o.menu || []; } });
} else { menu = []; }
// 设置菜单
if (i > index){ this .SetSelect( this .Selects[i], menu, this .Default.shift()); }
} else {
// 没有数据
this .SetSelect( this .Selects[i], [], "" );
}
}
// 清空默认值
this .Default.length = 0 ;
},
// select设置
SetSelect: function (oSel, menu, value) {
oSel.options.length = 0 ; oSel.disabled = false ;
if ( this .ShowEmpty){ oSel.appendChild(GetOption( "" , this .EmptyText)); }
if (menu.length <= 0 ){ oSel.disabled = true ; return ; }
Each(menu, function (o){
var op = GetOption(o.val, o.txt ? o.txt : o.val); op.selected = (value == op.value);
oSel.appendChild(op);
});
},
// 添加菜单
Add: function (menu) {
this .Menu[ this .Menu.length] = menu;
this .ReSet();
},
// 删除菜单
Delete: function (index) {
if (index < 0 || index >= this .Menu.length) return ;
for ( var i = index, len = this .Menu.length - 1 ; i < len; i ++ ){ this .Menu[i] = this .Menu[i + 1 ]; }
this .Menu.pop()
this .ReSet();
}
};
window.onload = function (){
var menu = [
{ ' val ' : ' 1 ' , ' txt ' : ' value ' },
{ ' val ' : ' 2 -> ' , ' menu ' : [
{ ' val ' : ' 2_1 ' },
{ ' val ' : ' 2_2 ' }
]},
{ ' val ' : ' 3 -> ' , ' menu ' : [
{ ' val ' : ' 3_1 -> ' , ' menu ' : [
{ ' val ' : ' 3_1_1 ' },
{ ' val ' : ' 3_1_2 ' }
]},
{ ' val ' : ' 3_2 ' }
]},
{ ' val ' : ' 4 -> ' , ' menu ' : [
{ ' val ' : ' 4_1 -> ' , ' menu ' : [
{ ' val ' : ' 4_1_1 -> ' , ' menu ' : [
{ ' val ' : ' 4_1_1_1 ' }
]}
]}
]}
];
var sel = [ " sel1 " , " sel2 " , " sel3 " , " sel4 " , " sel5 " ];
var val = [ " 3 -> " , " 3_1 -> " , " 3_1_2 " ];
var cs = new CascadeSelect(sel, menu, { Default: val });
$( " btnA " ).onclick = function (){cs.ShowEmpty =! cs.ShowEmpty;}
$( " btnB " ).onclick = function (){
cs.Add(
{ ' val ' : ' 5 -> ' , ' menu '