您的位置:首页 > Web前端 > JavaScript

JavaScript 多级联动select

2008-06-24 10:52 323 查看
能够根据自定义的菜单数据和select,自动设置联级的下拉菜单,可定义默认值。

效果:

.sel select{ width:100px;}

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();
}
};





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': [
{'val': '5_1 ->', 'menu': [
{'val': '5_1_1 ->', 'menu': [
{'val': '5_1_1_1 ->', 'menu': [
{'val': '5_1_1_1_1'}
]}
]}
]}
]}
)
}

$$("btnC").onclick=function(){
cs.Delete(3)
}

其中参数1是菜单结构:




菜单对象

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': [

{'val': '5_1 ->', 'menu': [

{'val': '5_1_1 ->', 'menu': [

{'val': '5_1_1_1 ->', 'menu': [

{'val': '5_1_1_1_1'}

]}

]}

]}

]}

)

}



$("btnC").onclick=function(){

cs.Delete(3)

}

}

</script>

<style type="text/css">

.sel select{ width:100px;}

</style>

</head>

<body>

<div class="sel">

<select id="sel1"></select>

<select id="sel2"></select>

<select id="sel3"></select>

<select id="sel4"></select>

<select id="sel5"></select>

</div>

<br />

<div>

<input id="btnA" type="button" value="显示/不显示空值" />

<input id="btnB" type="button" value="添加菜单" />

<input id="btnC" type="button" value="减少菜单" />

</div>

</body>

</html>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: